fixes issue with RD encoding in names (#59990)

fixes issue with file download function on ASM file transfer endpoints
corrects doc fragments
removes not used parameters
corrects various sanity failures previously ignored across multiple modules
This commit is contained in:
Wojciech Wypior 2019-08-06 18:11:02 +01:00 committed by Tim Rupp
parent 54b04f227e
commit 2af67f0dce
28 changed files with 556 additions and 548 deletions

View file

@ -32,6 +32,7 @@ f5_provider_spec = {
),
'server_port': dict(
type='int',
default=443,
fallback=(env_fallback, ['F5_SERVER_PORT'])
),
'user': dict(
@ -47,6 +48,7 @@ f5_provider_spec = {
),
'validate_certs': dict(
type='bool',
default='yes',
fallback=(env_fallback, ['F5_VALIDATE_CERTS'])
),
'transport': dict(
@ -55,7 +57,6 @@ f5_provider_spec = {
),
'timeout': dict(type='int'),
'auth_provider': dict(),
'proxy_to': dict(),
}
f5_argument_spec = {
@ -171,8 +172,8 @@ def run_commands(module, commands, check_rc=True):
def flatten_boolean(value):
truthy = list(BOOLEANS_TRUE) + ['enabled', 'True']
falsey = list(BOOLEANS_FALSE) + ['disabled', 'False']
truthy = list(BOOLEANS_TRUE) + ['enabled', 'True', 'true']
falsey = list(BOOLEANS_FALSE) + ['disabled', 'False', 'false']
if value is None:
return None
elif value in truthy:
@ -251,6 +252,7 @@ def transform_name(partition='', name='', sub_path=''):
if name:
name = name.replace('/', '~')
name = name.replace('%', '%25')
if partition:
partition = partition.replace('/', '~')
@ -415,7 +417,6 @@ class F5BaseClient(object):
self.merge_provider_auth_provider_param(result, provider)
self.merge_provider_user_param(result, provider)
self.merge_provider_password_param(result, provider)
self.merge_proxy_to_param(result, provider)
return result
@ -490,12 +491,6 @@ class F5BaseClient(object):
else:
result['password'] = None
def merge_proxy_to_param(self, result, provider):
if self.validate_params('proxy_to', provider):
result['proxy_to'] = provider['proxy_to']
else:
result['proxy_to'] = None
class AnsibleF5Parameters(object):
def __init__(self, *args, **kwargs):

View file

@ -296,6 +296,45 @@ class TransactionContextManager(object):
raise Exception
def download_asm_file(client, url, dest):
"""Download an ASM file from the remote device
This method handles issues with ASM file endpoints that allow
downloads of ASM objects on the BIG-IP.
Arguments:
client (object): The F5RestClient connection object.
url (string): The URL to download.
dest (string): The location on (Ansible controller) disk to store the file.
Returns:
bool: True on success. False otherwise.
"""
with open(dest, 'wb') as fileobj:
headers = {
'Content-Type': 'application/json'
}
data = {'headers': headers,
'verify': False
}
response = client.api.get(url, headers=headers, json=data)
if response.status == 200:
if 'Content-Length' not in response.headers:
error_message = "The Content-Length header is not present."
raise F5ModuleError(error_message)
length = response.headers['Content-Length']
if int(length) > 0:
fileobj.write(response.content)
else:
error = "Invalid Content-Length value returned: %s ," \
"the value should be greater than 0" % length
raise F5ModuleError(error)
def download_file(client, url, dest):
"""Download a file from the remote device

View file

@ -46,6 +46,7 @@ options:
partition:
description:
- Device partition to manage resources on.
type: str
default: Common
notes:
- Due to ID685681 it is not possible to execute ng_* tools via REST api on v12.x and 13.x, once this is fixed

View file

@ -183,7 +183,7 @@ try:
from library.module_utils.network.f5.common import fq_name
from library.module_utils.network.f5.common import f5_argument_spec
from library.module_utils.network.f5.common import flatten_boolean
from library.module_utils.network.f5.icontrol import download_file
from library.module_utils.network.f5.icontrol import download_asm_file
from library.module_utils.network.f5.icontrol import module_provisioned
except ImportError:
from ansible.module_utils.network.f5.bigip import F5RestClient
@ -192,7 +192,7 @@ except ImportError:
from ansible.module_utils.network.f5.common import fq_name
from ansible.module_utils.network.f5.common import f5_argument_spec
from ansible.module_utils.network.f5.common import flatten_boolean
from ansible.module_utils.network.f5.icontrol import download_file
from ansible.module_utils.network.f5.icontrol import download_asm_file
from ansible.module_utils.network.f5.icontrol import module_provisioned
@ -592,7 +592,7 @@ class ModuleManager(object):
self.want.file
)
try:
download_file(self.client, url, dest)
download_asm_file(self.client, url, dest)
except F5ModuleError:
raise F5ModuleError(
"Failed to download the file."

View file

@ -23,11 +23,13 @@ options:
name:
description:
- Specifies the name of the alias.
type: str
required: True
scope:
description:
- The scope of the alias; whether it is shared on the system, or usable only
for the user who created it.
type: str
default: shared
choices:
- private
@ -35,18 +37,22 @@ options:
command:
description:
- The command to alias.
type: str
description:
description:
- Description of the alias.
type: str
partition:
description:
- Device partition to manage resources on.
- This parameter is disregarded when the C(scope) is C(private).
type: str
default: Common
state:
description:
- When C(present), ensures that the resource exists.
- When C(absent), ensures the resource is removed.
type: str
default: present
choices:
- present
@ -54,6 +60,7 @@ options:
extends_documentation_fragment: f5
author:
- Tim Rupp (@caphrim007)
- Wojciech Wypior (@wojtek0806)
'''
EXAMPLES = r'''

View file

@ -25,6 +25,7 @@ options:
name:
description:
- Specifies the name of the script.
type: str
required: True
content:
description:
@ -32,17 +33,21 @@ options:
- This parameter is typically used in conjunction with Ansible's C(file), or
template lookup plugins. If this sounds foreign to you, see the examples
in this documentation.
type: str
description:
description:
- Description of the cli script.
type: str
partition:
description:
- Device partition to manage resources on.
type: str
default: Common
state:
description:
- When C(present), ensures that the script exists.
- When C(absent), ensures the script is removed.
type: str
default: present
choices:
- present
@ -50,6 +55,7 @@ options:
extends_documentation_fragment: f5
author:
- Tim Rupp (@caphrim007)
- Wojciech Wypior (@wojtek0806)
'''
EXAMPLES = r'''

View file

@ -39,6 +39,7 @@ options:
logic that is outside of C(tmsh) (such as grep'ing, awk'ing or other shell
related things that are not C(tmsh), this behavior is not supported.
required: True
type: raw
wait_for:
description:
- Specifies what to evaluate from the output of the command
@ -46,6 +47,7 @@ options:
the task to wait for a particular conditional to be true
before moving forward. If the conditional is not true
by the configured retries, the task fails. See examples.
type: list
aliases: ['waitfor']
match:
description:
@ -55,6 +57,7 @@ options:
then all conditionals in the I(wait_for) must be satisfied. If
the value is set to C(any) then only one of the values must be
satisfied.
type: str
choices:
- any
- all
@ -65,6 +68,7 @@ options:
before it is considered failed. The command is run on the
target device every retry and evaluated against the I(wait_for)
conditionals.
type: int
default: 10
interval:
description:
@ -72,6 +76,7 @@ options:
of the command. If the command does not pass the specified
conditional, the interval indicates how to long to wait before
trying the command again.
type: int
default: 1
transport:
description:
@ -97,6 +102,7 @@ options:
chdir:
description:
- Change into this directory before running the command.
type: str
version_added: 2.6
extends_documentation_fragment: f5
author:

View file

@ -50,6 +50,7 @@ options:
C(tmsh) command C(load sys config from-terminal merge).
- If you need to read configuration from a file or template, use
Ansible's C(file) or C(template) lookup plugins respectively.
type: str
verify:
description:
- Validates the specified configuration to see whether they are

View file

@ -44,6 +44,7 @@ options:
ip_version:
description:
- Specifies whether the DNS specifies IP addresses using IPv4 or IPv6.
type: int
choices:
- 4
- 6

View file

@ -90,6 +90,7 @@ options:
- traffic-groups
- trunks
- udp-profiles
- users
- vcmp-guests
- virtual-addresses
- virtual-servers
@ -153,6 +154,7 @@ options:
- "!traffic-groups"
- "!trunks"
- "!udp-profiles"
- "!users"
- "!vcmp-guests"
- "!virtual-addresses"
- "!virtual-servers"
@ -6088,6 +6090,53 @@ udp_profiles:
type: bool
sample: yes
sample: hash/dictionary of values
users:
description: Details of the users on the system
returned: When C(users) is specified in C(gather_subset).
type: complex
contains:
description:
description:
- Description of the resource.
returned: queried
type: str
sample: Admin user
full_path:
description:
- Full name of the resource as known to BIG-IP.
returned: queried
type: str
sample: admin
name:
description:
- Relative name of the resource in BIG-IP.
returned: queried
type: str
sample: admin
partition_access:
description:
- Partition that user has access to, including user role.
returned: queried
type: complex
contains:
name:
description:
- Name of patition
returned: queried
type: str
sample: all-partitions
role:
description:
- Role allowed to user on parition
returned: queried
type: str
sample: auditor
shell:
description:
- The shell assigned to the user account
returned: queried
type: str
sample: tmsh
vcmp_guests:
description: vCMP related information.
returned: When C(vcmp-guests) is specified in C(gather_subset).
@ -6165,6 +6214,12 @@ vcmp_guests:
returned: queried
type: str
sample: bridged
vlans:
description:
- List of VLANs on which the guest is either enabled or disabled.
returned: queried
type: list
sample: ['/Common/vlan1', '/Common/vlan2']
min_number_of_slots:
description:
- Specifies the minimum number of slots that the guest must be assigned to.
@ -14529,6 +14584,88 @@ class TrunksFactManager(BaseManager):
return {}
class UsersParameters(BaseParameters):
api_map = {
'fullPath': 'full_path',
'partitionAccess': 'partition_access',
}
returnables = [
'full_path',
'name',
'description',
'partition_access',
'shell',
]
@property
def partition_access(self):
result = []
if self._values['partition_access'] is None:
return []
for partition in self._values['partition_access']:
del partition['nameReference']
result.append(partition)
return result
@property
def shell(self):
if self._values['shell'] in [None, 'none']:
return None
return self._values['shell']
class UsersFactManager(BaseManager):
def __init__(self, *args, **kwargs):
self.client = kwargs.get('client', None)
self.module = kwargs.get('module', None)
super(UsersFactManager, self).__init__(**kwargs)
self.want = UsersParameters(params=self.module.params)
def exec_module(self):
facts = self._exec_module()
result = dict(users=facts)
return result
def _exec_module(self):
results = []
facts = self.read_facts()
for item in facts:
attrs = item.to_return()
results.append(attrs)
results = sorted(results, key=lambda k: k['full_path'])
return results
def read_facts(self):
results = []
collection = self.read_collection_from_device()
for resource in collection:
attrs = resource
params = UsersParameters(params=attrs)
results.append(params)
return results
def read_collection_from_device(self):
uri = "https://{0}:{1}/mgmt/tm/auth/user".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
if 'items' not in response:
return []
result = response['items']
return result
class UdpProfilesParameters(BaseParameters):
api_map = {
'fullPath': 'full_path',
@ -14672,6 +14809,7 @@ class VcmpGuestsParameters(BaseParameters):
'mgmt_route',
'mgmt_address',
'mgmt_network',
'vlans',
'min_number_of_slots',
'number_of_slots',
'ssl_mode',
@ -15241,20 +15379,85 @@ class VirtualServersParameters(BaseParameters):
return False
def _read_current_message_routing_profiles_from_device(self):
collection1 = self.client.api.tm.ltm.profile.diameters.get_collection()
collection2 = self.client.api.tm.ltm.profile.sips.get_collection()
result = [x.name for x in collection1]
result += [x.name for x in collection2]
result = []
result += self._read_diameter_profiles_from_device()
result += self._read_sip_profiles_from_device()
return result
def _read_diameter_profiles_from_device(self):
uri = "https://{0}:{1}/mgmt/tm/ltm/profile/diameter/".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
result = [x['name'] for x in response['items']]
return result
def _read_sip_profiles_from_device(self):
uri = "https://{0}:{1}/mgmt/tm/ltm/profile/sip/".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
result = [x['name'] for x in response['items']]
return result
def _read_current_fastl4_profiles_from_device(self):
collection = self.client.api.tm.ltm.profile.fastl4s.get_collection()
result = [x.name for x in collection]
uri = "https://{0}:{1}/mgmt/tm/ltm/profile/fastl4/".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
result = [x['name'] for x in response['items']]
return result
def _read_current_fasthttp_profiles_from_device(self):
collection = self.client.api.tm.ltm.profile.fasthttps.get_collection()
result = [x.name for x in collection]
uri = "https://{0}:{1}/mgmt/tm/ltm/profile/fasthttp/".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
result = [x['name'] for x in response['items']]
return result
@property
@ -15760,6 +15963,7 @@ class ModuleManager(object):
'traffic-groups': TrafficGroupsFactManager,
'trunks': TrunksFactManager,
'udp-profiles': UdpProfilesFactManager,
'users': UsersFactManager,
'vcmp-guests': VcmpGuestsFactManager,
'virtual-addresses': VirtualAddressesFactManager,
'virtual-servers': VirtualServersFactManager,
@ -15959,6 +16163,7 @@ class ArgumentSpec(object):
'traffic-groups',
'trunks',
'udp-profiles',
'users',
'vcmp-guests',
'virtual-addresses',
'virtual-servers',
@ -16026,6 +16231,7 @@ class ArgumentSpec(object):
'!traffic-groups',
'!trunks',
'!udp-profiles',
'!users',
'!vcmp-guests',
'!virtual-addresses',
'!virtual-servers',

View file

@ -100,6 +100,7 @@ options:
- To specify the log_publisher on a different partition from the AFM log profile, specify the name in fullpath
format, e.g. C(/Foobar/log-publisher), otherwise the partition for log publisher
is inferred from C(partition) module parameter.
type: str
rate_limit:
description:
- Defines a rate limit for all combined port misuse log messages per second. Beyond this rate limit,

View file

@ -23,6 +23,7 @@ options:
name:
description:
- Specifies the name of the region.
type: str
required: True
region_members:
description:

View file

@ -65,6 +65,7 @@ options:
partition:
description:
- Device partition to manage resources on.
type: str
default: Common
extends_documentation_fragment: f5
author:

View file

@ -42,6 +42,7 @@ options:
description:
- Specifies the type of source address translation associated with the specified transport config.
- When set to C(snat) the C(pool) parameter needs to contain a name for a valid LSN or SNAT pool.
type: str
choices:
- snat
- none

View file

@ -23,6 +23,7 @@ options:
name:
description:
- Specifies the name of the monitor.
type: str
required: True
parent:
description:

View file

@ -186,6 +186,7 @@ options:
- Monitor rule type when C(monitors) is specified.
- When creating a new pool, if this value is not specified, the default of
'all' will be used.
type: str
choices:
- all
- at_least

View file

@ -138,6 +138,7 @@ options:
- Specifies the fully qualified DNS hostname of the server used in Server Name Indication communications.
When creating a new profile, the setting is provided by the parent profile.
- The server name can also be a wildcard string containing the asterisk C(*) character.
type: str
version_added: 2.8
sni_default:
description:

View file

@ -1719,7 +1719,7 @@ class ArgumentSpec(object):
poll_interval=dict(type='int'),
poll_interval_global=dict(type='bool'),
sampling_rate=dict(type='int'),
sampling_rate_global=dict(type='int'),
sampling_rate_global=dict(type='bool'),
)
),
state=dict(

View file

@ -38,9 +38,12 @@ options:
- ilx
- lc
- ltm
- mgmt
- pem
- sam
- sslo
- swg
- urldb
- vcmp
aliases:
- name
@ -51,21 +54,38 @@ options:
For example, changing one module to C(dedicated) requires setting all
others to C(none). Setting the level of a module to C(none) means that
the module is not activated.
- This parameter is not relevant to C(cgnat) and will not be applied to the
C(cgnat) module.
- Use c(state) absent to set c(level) to none and de-provision module.
- This parameter is not relevant to C(cgnat - pre tmos 15.0) or C(mgmt) and will not be
applied to the C(cgnat - pre tmos 15.0) or C(mgmt) module.
type: str
choices:
- dedicated
- nominal
- minimum
default: nominal
memory:
description:
- Sets additional memory for management module. This is in addition to
minimum allocated RAM of 1264MB.
- The accepted value range is C(0 - 8192). Maximum value is restricted by
systems available RAM.
- Specifying C(large) reserves an additional 500MB for mgmt module.
- Specifying C(medium) reserves an additional 200MB for mgmt module.
- Specifying C(small) reserves no additional RAM for mgmt module.
- Use Large for configurations containing more than 2000 objects, or
more specifically, for any configuration that exceeds 1000 objects
per 2 GB of installed memory. Changing the Management C(mgmt) size
after initial provisioning causes a reprovision operation
type: str
version_added: 2.9
state:
description:
- The state of the provisioned module on the system. When C(present),
guarantees that the specified module is provisioned at the requested
level provided that there are sufficient resources on the device (such
as physical RAM) to support the provisioned module. When C(absent),
de-provision the module.
as physical RAM) to support the provisioned module.
- When C(absent), de-provision the module.
- C(absent), is not a relevent option to C(mgmt) module as module can not be de-provisioned.
type: str
choices:
- present
@ -74,6 +94,7 @@ options:
extends_documentation_fragment: f5
author:
- Tim Rupp (@caphrim007)
- Greg Crosby (@crosbygw)
'''
EXAMPLES = r'''
@ -96,6 +117,16 @@ EXAMPLES = r'''
password: secret
user: admin
delegate_to: localhost
- name: Provision mgmt with medium amount of memory.
bigip_provision:
module: mgmt
memory: medium
provider:
server: lb.mydomain.com
password: secret
user: admin
delegate_to: localhost
'''
RETURN = r'''
@ -104,11 +135,17 @@ level:
returned: changed
type: str
sample: minimum
memory:
description: The new provisioned amount of memory for mgmt module.
returned: changed
type: str
sample: large
'''
import time
from ansible.module_utils.basic import AnsibleModule
from distutils.version import LooseVersion
try:
from library.module_utils.network.f5.bigip import F5RestClient
@ -116,28 +153,36 @@ try:
from library.module_utils.network.f5.common import AnsibleF5Parameters
from library.module_utils.network.f5.common import f5_argument_spec
from library.module_utils.network.f5.icontrol import TransactionContextManager
from library.module_utils.network.f5.icontrol import tmos_version
except ImportError:
from ansible.module_utils.network.f5.bigip import F5RestClient
from ansible.module_utils.network.f5.common import F5ModuleError
from ansible.module_utils.network.f5.common import AnsibleF5Parameters
from ansible.module_utils.network.f5.common import f5_argument_spec
from ansible.module_utils.network.f5.icontrol import TransactionContextManager
from ansible.module_utils.network.f5.icontrol import tmos_version
class Parameters(AnsibleF5Parameters):
api_attributes = ['level']
api_map = {
'value': 'memory',
}
returnables = ['level']
api_attributes = [
'level',
'value',
]
updatables = ['level', 'cgnat']
returnables = [
'level',
'memory',
]
@property
def level(self):
if self._values['level'] is None:
return None
if self.state == 'absent':
return 'none'
return str(self._values['level'])
updatables = [
'level',
'cgnat',
'memory',
]
class ApiParameters(Parameters):
@ -145,7 +190,37 @@ class ApiParameters(Parameters):
class ModuleParameters(Parameters):
pass
def _validate_memory_limit(self, limit):
if self._values['memory'] == 'small':
return '0'
if self._values['memory'] == 'medium':
return '200'
if self._values['memory'] == 'large':
return '500'
if 0 <= int(limit) <= 8192:
return str(limit)
raise F5ModuleError(
"Valid 'memory' must be in range 0 - 8192, 'small', 'medium', or 'large'."
)
@property
def level(self):
if self._values['level'] is None:
return None
if self._values['module'] == 'mgmt':
return None
if self.state == 'absent':
return 'none'
return str(self._values['level'])
@property
def memory(self):
if self._values['memory'] is None:
return None
if self._values['module'] != 'mgmt':
return None
return int(self._validate_memory_limit(self._values['memory']))
class Changes(Parameters):
@ -165,7 +240,17 @@ class UsableChanges(Changes):
class ReportableChanges(Changes):
pass
@property
def memory(self):
if self._values['memory'] is None:
return None
if self._values['memory'] == '0':
return 'small'
if self._values['memory'] == '200':
return 'medium'
if self._values['memory'] == '500':
return 'large'
return str(self._values['memory'])
class Difference(object):
@ -234,19 +319,26 @@ class ModuleManager(object):
changed = self.present()
elif state == "absent":
changed = self.absent()
changes = self.changes.to_return()
reportable = ReportableChanges(params=self.changes.to_return())
changes = reportable.to_return()
result.update(**changes)
result.update(dict(changed=changed))
return result
def version_is_greater_or_equal_15(self):
version = tmos_version(self.client)
if LooseVersion(version) >= LooseVersion('15.0.0'):
return True
else:
return False
def present(self):
if self.exists():
return False
return self.update()
def exists(self):
if self.want.module == 'cgnat':
if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15():
uri = "https://{0}:{1}/mgmt/tm/sys/feature-module/cgnat/".format(
self.client.provider['server'],
self.client.provider['server_port'],
@ -257,7 +349,7 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
@ -266,6 +358,25 @@ class ModuleManager(object):
return False
elif 'enabled' in response and response['enabled'] is True:
return True
elif self.want.module == 'mgmt':
uri = "https://{0}:{1}/mgmt/tm/sys/db/provision.extramb/".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError:
return False
if resp.status == 404 or 'code' in response and response['code'] == 404:
return False
if str(response['value']) != 0 and self.want.memory == 0:
return False
if str(response['value']) == 0 and self.want.memory == 0:
return True
if str(response['value']) == self.want.memory:
return True
return False
try:
for x in range(0, 5):
uri = "https://{0}:{1}/mgmt/tm/sys/provision/{2}".format(
@ -279,7 +390,7 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
@ -303,11 +414,9 @@ class ModuleManager(object):
return False
if self.module.check_mode:
return True
result = self.update_on_device()
if self.want.module == 'cgnat':
if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15():
return result
self._wait_for_module_provisioning()
if self.want.module == 'vcmp':
@ -318,6 +427,10 @@ class ModuleManager(object):
self._wait_for_asm_ready()
if self.want.module == 'afm':
self._wait_for_afm_ready()
if self.want.module == 'cgnat':
self._wait_for_cgnat_ready()
if self.want.module == 'mgmt':
self._wait_for_mgmt_ready()
return True
def should_reboot(self):
@ -334,7 +447,7 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
@ -404,11 +517,11 @@ class ModuleManager(object):
return False
def update_on_device(self):
if self.want.module == 'cgnat':
if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15():
if self.changes.cgnat:
return self.provision_cgnat_on_device()
return False
elif self.want.level == 'dedicated':
elif self.want.level == 'dedicated' and self.want.module != 'mgmt':
self.provision_dedicated_on_device()
else:
self.provision_non_dedicated_on_device()
@ -425,7 +538,7 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
@ -444,7 +557,7 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
@ -461,7 +574,7 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
@ -474,7 +587,7 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
@ -482,25 +595,31 @@ class ModuleManager(object):
def provision_non_dedicated_on_device(self):
params = self.want.api_params()
uri = "https://{0}:{1}/mgmt/tm/sys/provision/{2}".format(
self.client.provider['server'],
self.client.provider['server_port'],
self.want.module
)
if self.want.module == 'mgmt':
uri = "https://{0}:{1}/mgmt/tm/sys/db/provision.extramb/".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
else:
uri = "https://{0}:{1}/mgmt/tm/sys/provision/{2}".format(
self.client.provider['server'],
self.client.provider['server_port'],
self.want.module
)
resp = self.client.api.patch(uri, json=params)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
def read_current_from_device(self):
if self.want.module == 'cgnat':
if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15():
uri = "https://{0}:{1}/mgmt/tm/sys/feature-module/cgnat/".format(
self.client.provider['server'],
self.client.provider['server_port'],
@ -511,12 +630,27 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
elif self.want.module == 'mgmt':
uri = "https://{0}:{1}/mgmt/tm/sys/db/provision.extramb/".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
else:
uri = "https://{0}:{1}/mgmt/tm/sys/provision/{2}".format(
self.client.provider['server'],
@ -529,7 +663,7 @@ class ModuleManager(object):
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] == 400:
if 'code' in response and response['code'] in [400, 404]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
@ -544,7 +678,7 @@ class ModuleManager(object):
def remove(self):
if self.module.check_mode:
return True
if self.want.module == 'cgnat':
if self.want.module == 'cgnat' and not self.version_is_greater_or_equal_15():
return self.deprovision_cgnat_on_device()
self.remove_from_device()
@ -760,6 +894,78 @@ class ModuleManager(object):
pass
time.sleep(5)
def _wait_for_cgnat_ready(self):
"""Waits specifically for CGNAT
Starting in TMOS 15.0 cgnat can take longer to actually start up than all the previous checks take.
This check here is specifically waiting for a cgnat API to stop raising
errors.
:return:
"""
nops = 0
while nops < 3:
try:
uri = "https://{0}:{1}/mgmt/tm/ltm/lsn-pool".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] in [400, 403]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
if len(response['items']) >= 0:
nops += 1
else:
nops = 0
except Exception as ex:
pass
time.sleep(5)
def _wait_for_mgmt_ready(self):
"""Waits specifically for CGNAT
Modifying memory reserve for mgmt can take longer to actually start up than all the previous checks take.
This check here is specifically waiting for a cgnat API to stop raising
errors.
:return:
"""
nops = 0
while nops < 3:
try:
uri = "https://{0}:{1}/mgmt/tm".format(
self.client.provider['server'],
self.client.provider['server_port'],
)
resp = self.client.api.get(uri)
try:
response = resp.json()
except ValueError as ex:
raise F5ModuleError(str(ex))
if 'code' in response and response['code'] in [400, 403]:
if 'message' in response:
raise F5ModuleError(response['message'])
else:
raise F5ModuleError(resp.content)
if len(response['items']) >= 0:
nops += 1
else:
nops = 0
except Exception as ex:
pass
time.sleep(5)
def _restart_asm(self):
try:
params = dict(
@ -848,9 +1054,9 @@ class ArgumentSpec(object):
module=dict(
required=True,
choices=[
'afm', 'am', 'sam', 'asm', 'avr', 'fps',
'gtm', 'lc', 'ltm', 'pem', 'swg', 'ilx',
'apm', 'vcmp', 'cgnat'
'afm', 'am', 'apm', 'asm', 'avr', 'cgnat',
'fps', 'gtm', 'ilx', 'lc', 'ltm', 'mgmt',
'pem', 'sam', 'sslo', 'swg', 'urldb', 'vcmp'
],
aliases=['name']
),
@ -858,6 +1064,7 @@ class ArgumentSpec(object):
default='nominal',
choices=['nominal', 'dedicated', 'minimum']
),
memory=dict(),
state=dict(
default='present',
choices=['present', 'absent']

View file

@ -58,7 +58,7 @@ options:
passphrase:
description:
- Specifies the passphrase that is necessary to load the specified UCS file.
type: bool
type: str
reset_trust:
description:
- When specified, the device and trust domain certs and keys are not

View file

@ -1068,9 +1068,9 @@ class ArgumentSpec(object):
def __init__(self):
self.supports_check_mode = True
argument_spec = dict(
name=dict(
username_credential=dict(
required=True,
aliases=['username_credential']
aliases=['name']
),
password_credential=dict(
no_log=True,

View file

@ -902,7 +902,7 @@ class ArgumentSpec(object):
options=dict(
interface=dict(),
tagging=dict(
choice=['tagged', 'untagged']
choices=['tagged', 'untagged']
)
)
),

View file

@ -53,6 +53,7 @@ options:
inbound_virtual:
description:
- Settings to configure the virtual which will receive the inbound connection.
type: dict
suboptions:
address:
description:
@ -72,8 +73,8 @@ options:
- The port that the virtual listens for connections on.
- When creating a new application, if this parameter is not specified, the
default value of C(8080) will be used.
type: str
default: 8080
type: dict
service_environment:
description:
- Specifies the name of service environment that the application will be

View file

@ -53,6 +53,7 @@ options:
inbound_virtual:
description:
- Settings to configure the virtual which will receive the inbound connection.
type: dict
suboptions:
address:
description:

View file

@ -152,6 +152,7 @@ options:
- Specifies the name of service environment or the hostname of the BIG-IP that
the application will be deployed to.
- When creating a new application, this parameter is required.
type: str
add_analytics:
description:
- Collects statistics of the BIG-IP that the application is deployed to.

View file

@ -119,6 +119,7 @@ options:
statistics:
description:
- Specify the statistics collection for discovered device.
type: dict
suboptions:
enable:
description:

View file

@ -52,7 +52,6 @@ options:
for either connecting or sending commands. If the timeout is
exceeded before the operation is completed, the module will error.
type: int
default: 10
ssh_keyfile:
description:
- Specifies the SSH keyfile to use to authenticate the connection to
@ -66,6 +65,11 @@ options:
type: str
choices: [ cli, rest ]
default: rest
auth_provider:
description:
- Configures the auth provider for to obtain authentication tokens from the remote device.
- This option is really used when working with BIG-IQ devices.
type: str
notes:
- For more information on using Ansible to manage F5 Networks devices see U(https://www.ansible.com/integrations/networks/f5).
- Requires BIG-IP software version >= 12.

View file

@ -3682,504 +3682,28 @@ lib/ansible/modules/network/exos/exos_command.py validate-modules:E338
lib/ansible/modules/network/exos/exos_config.py validate-modules:E337
lib/ansible/modules/network/exos/exos_config.py validate-modules:E338
lib/ansible/modules/network/exos/exos_facts.py validate-modules:E337
lib/ansible/modules/network/f5/_bigip_asm_policy.py validate-modules:E322
lib/ansible/modules/network/f5/_bigip_asm_policy.py validate-modules:E324
lib/ansible/modules/network/f5/_bigip_asm_policy.py validate-modules:E337
lib/ansible/modules/network/f5/_bigip_asm_policy.py validate-modules:E338
lib/ansible/modules/network/f5/_bigip_facts.py validate-modules:E322
lib/ansible/modules/network/f5/_bigip_facts.py validate-modules:E324
lib/ansible/modules/network/f5/_bigip_facts.py validate-modules:E337
lib/ansible/modules/network/f5/_bigip_facts.py validate-modules:E338
lib/ansible/modules/network/f5/_bigip_gtm_facts.py validate-modules:E322
lib/ansible/modules/network/f5/_bigip_gtm_facts.py validate-modules:E324
lib/ansible/modules/network/f5/_bigip_gtm_facts.py validate-modules:E337
lib/ansible/modules/network/f5/_bigip_gtm_facts.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_apm_policy_fetch.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_apm_policy_fetch.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_apm_policy_fetch.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_apm_policy_import.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_apm_policy_import.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_apm_policy_import.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_appsvcs_extension.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_appsvcs_extension.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_appsvcs_extension.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_asm_policy_fetch.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_asm_policy_import.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_asm_policy_import.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_asm_policy_import.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_asm_policy_manage.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_asm_policy_manage.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_asm_policy_manage.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_asm_policy_server_technology.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_asm_policy_server_technology.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_asm_policy_server_technology.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_asm_policy_signature_set.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_asm_policy_signature_set.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_asm_policy_signature_set.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_cli_alias.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_cli_alias.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_cli_alias.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_cli_script.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_cli_script.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_cli_script.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_command.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_command.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_command.py validate-modules:E337
lib/ansible/modules/network/f5/bigip_command.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_config.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_config.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_config.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_configsync_action.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_configsync_action.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_configsync_action.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_data_group.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_data_group.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_data_group.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_auth.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_auth.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_auth.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_auth_ldap.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_auth_ldap.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_auth_ldap.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_connectivity.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_connectivity.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_connectivity.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_dns.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_dns.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_dns.py validate-modules:E337
lib/ansible/modules/network/f5/bigip_device_dns.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_group.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_group.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_group.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_group_member.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_group_member.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_group_member.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_ha_group.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_ha_group.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_ha_group.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_httpd.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_httpd.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_httpd.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_info.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_info.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_info.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_license.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_license.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_license.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_ntp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_ntp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_ntp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_sshd.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_sshd.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_sshd.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_syslog.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_syslog.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_syslog.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_traffic_group.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_traffic_group.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_traffic_group.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_device_trust.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_device_trust.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_device_trust.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_dns_cache_resolver.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_dns_cache_resolver.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_dns_cache_resolver.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_dns_nameserver.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_dns_nameserver.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_dns_nameserver.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_dns_resolver.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_dns_resolver.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_dns_resolver.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_dns_zone.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_dns_zone.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_dns_zone.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_file_copy.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_file_copy.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_file_copy.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_address_list.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_address_list.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_address_list.py validate-modules:E326
lib/ansible/modules/network/f5/bigip_firewall_address_list.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_dos_profile.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_dos_profile.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_dos_profile.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_dos_vector.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_dos_vector.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_dos_vector.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_global_rules.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_global_rules.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_global_rules.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_log_profile.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_log_profile.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_log_profile.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_log_profile_network.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_log_profile_network.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_log_profile_network.py validate-modules:E335
lib/ansible/modules/network/f5/bigip_firewall_log_profile_network.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_policy.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_policy.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_policy.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_port_list.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_port_list.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_port_list.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_rule.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_rule.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_rule.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_rule_list.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_rule_list.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_rule_list.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_firewall_schedule.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_firewall_schedule.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_firewall_schedule.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_datacenter.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_datacenter.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_datacenter.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_global.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_global.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_global.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_monitor_bigip.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_monitor_bigip.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_monitor_bigip.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_monitor_external.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_monitor_external.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_monitor_external.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_monitor_firepass.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_monitor_firepass.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_monitor_firepass.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_monitor_http.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_monitor_http.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_monitor_http.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_monitor_https.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_monitor_https.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_monitor_https.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp_half_open.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp_half_open.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_monitor_tcp_half_open.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_pool.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_pool.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_pool.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E326
lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E337
lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_pool_member.py validate-modules:E340
lib/ansible/modules/network/f5/bigip_gtm_server.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_server.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_server.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_topology_record.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_topology_record.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_topology_record.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_topology_region.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_topology_region.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_topology_region.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_virtual_server.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_virtual_server.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_virtual_server.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_gtm_wide_ip.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_gtm_wide_ip.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_gtm_wide_ip.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_hostname.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_hostname.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_hostname.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_iapp_service.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_iapp_service.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_iapp_service.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_iapp_template.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_iapp_template.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_iapp_template.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_ike_peer.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_ike_peer.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_ike_peer.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_imish_config.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_imish_config.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_imish_config.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_ipsec_policy.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_ipsec_policy.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_ipsec_policy.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_irule.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_irule.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_irule.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_log_destination.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_log_destination.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_log_destination.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_log_publisher.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_log_publisher.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_log_publisher.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_lx_package.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_lx_package.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_lx_package.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_management_route.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_management_route.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_management_route.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_message_routing_peer.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_message_routing_peer.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_message_routing_peer.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_message_routing_protocol.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_message_routing_protocol.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_message_routing_protocol.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_message_routing_route.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_message_routing_route.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_message_routing_route.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_message_routing_router.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_message_routing_router.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_message_routing_router.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_message_routing_transport_config.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_dns.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_dns.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_dns.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_external.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_external.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_external.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_gateway_icmp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_gateway_icmp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_gateway_icmp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_http.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_http.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_http.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_https.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_https.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_https.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_ldap.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_ldap.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_ldap.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_snmp_dca.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_snmp_dca.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_snmp_dca.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_tcp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_tcp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_tcp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_tcp_echo.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_tcp_echo.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_tcp_echo.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_monitor_udp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_monitor_udp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_monitor_udp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_node.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_node.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_node.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_partition.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_partition.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_partition.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_password_policy.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_password_policy.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_password_policy.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_policy.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_policy.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_policy.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_policy_rule.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_policy_rule.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_policy_rule.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E326
lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E337
lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_pool.py validate-modules:E340
lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E326
lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E337
lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_pool_member.py validate-modules:E340
lib/ansible/modules/network/f5/bigip_profile_analytics.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_analytics.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_analytics.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_client_ssl.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_client_ssl.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_client_ssl.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_dns.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_dns.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_dns.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_fastl4.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_fastl4.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_fastl4.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_http.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_http.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_http.py validate-modules:E325
lib/ansible/modules/network/f5/bigip_profile_http.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_http2.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_http2.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_http2.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_http_compression.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_http_compression.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_http_compression.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_oneconnect.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_oneconnect.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_oneconnect.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_persistence_cookie.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_persistence_cookie.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_persistence_cookie.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_persistence_src_addr.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_persistence_src_addr.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_persistence_src_addr.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_server_ssl.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_server_ssl.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_server_ssl.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_tcp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_tcp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_tcp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_profile_udp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_profile_udp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_profile_udp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_provision.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_provision.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_provision.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_qkview.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_qkview.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_qkview.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_remote_role.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_remote_role.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_remote_role.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_remote_syslog.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_remote_syslog.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_remote_syslog.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_remote_user.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_remote_user.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_remote_user.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_routedomain.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_routedomain.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_routedomain.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_selfip.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_selfip.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_selfip.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_service_policy.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_service_policy.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_service_policy.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_smtp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_smtp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_smtp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_snat_pool.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_snat_pool.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_snat_pool.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_snmp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_snmp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_snmp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_snmp_community.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_snmp_community.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_snmp_community.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_snmp_trap.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_snmp_trap.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_snmp_trap.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_software_image.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_software_image.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_software_image.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_software_install.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_software_install.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_software_install.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_software_update.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_software_update.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_software_update.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_ssl_certificate.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_ssl_certificate.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_ssl_certificate.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_ssl_key.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_ssl_key.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_ssl_key.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_ssl_ocsp.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_ssl_ocsp.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_ssl_ocsp.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_static_route.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_static_route.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_static_route.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_sys_daemon_log_tmm.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_sys_daemon_log_tmm.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_sys_daemon_log_tmm.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_sys_db.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_sys_db.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_sys_db.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_sys_global.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_sys_global.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_sys_global.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_timer_policy.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_timer_policy.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_timer_policy.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_traffic_selector.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_traffic_selector.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_traffic_selector.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_trunk.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_trunk.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_trunk.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_tunnel.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_tunnel.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_tunnel.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_ucs.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_ucs.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_ucs.py validate-modules:E335
lib/ansible/modules/network/f5/bigip_ucs.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_ucs_fetch.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_ucs_fetch.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_ucs_fetch.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_user.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_user.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_user.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_vcmp_guest.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_vcmp_guest.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_vcmp_guest.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_virtual_address.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_virtual_address.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_virtual_address.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_virtual_server.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_virtual_server.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_virtual_server.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_vlan.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_vlan.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_vlan.py validate-modules:E326
lib/ansible/modules/network/f5/bigip_vlan.py validate-modules:E338
lib/ansible/modules/network/f5/bigip_wait.py validate-modules:E322
lib/ansible/modules/network/f5/bigip_wait.py validate-modules:E324
lib/ansible/modules/network/f5/bigip_wait.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_application_fasthttp.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_application_fasthttp.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_application_fasthttp.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_application_fastl4_tcp.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py validate-modules:E337
lib/ansible/modules/network/f5/bigiq_application_fastl4_udp.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_application_http.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_application_http.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_application_http.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_application_https_offload.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_application_https_offload.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_application_https_offload.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_application_https_waf.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_application_https_waf.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_application_https_waf.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_device_discovery.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_device_discovery.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_device_discovery.py validate-modules:E337
lib/ansible/modules/network/f5/bigiq_device_discovery.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_device_info.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_device_info.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_device_info.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_regkey_license.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_regkey_license.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_regkey_license.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_regkey_license_assignment.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_regkey_license_assignment.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_regkey_license_assignment.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_regkey_pool.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_regkey_pool.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_regkey_pool.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_utility_license.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_utility_license.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_utility_license.py validate-modules:E338
lib/ansible/modules/network/f5/bigiq_utility_license_assignment.py validate-modules:E322
lib/ansible/modules/network/f5/bigiq_utility_license_assignment.py validate-modules:E324
lib/ansible/modules/network/f5/bigiq_utility_license_assignment.py validate-modules:E338
lib/ansible/modules/network/fortimanager/fmgr_device.py validate-modules:E337
lib/ansible/modules/network/fortimanager/fmgr_device_config.py validate-modules:E337
lib/ansible/modules/network/fortimanager/fmgr_device_group.py validate-modules:E337