diff --git a/lib/ansible/modules/network/nxos/nxos_snmp_community.py b/lib/ansible/modules/network/nxos/nxos_snmp_community.py index e1718a9d20f..5e2b2f9dab1 100644 --- a/lib/ansible/modules/network/nxos/nxos_snmp_community.py +++ b/lib/ansible/modules/network/nxos/nxos_snmp_community.py @@ -32,8 +32,6 @@ description: author: - Jason Edelman (@jedelman8) - Gabriele Gerbino (@GGabriele) -notes: - - Tested against NXOSv 7.3.(0)D1(1) on VIRL options: community: description: @@ -80,7 +78,9 @@ commands: ''' -from ansible.module_utils.nxos import load_config, run_commands +import re + +from ansible.module_utils.nxos import get_config, load_config, run_commands from ansible.module_utils.nxos import nxos_argument_spec, check_args from ansible.module_utils.basic import AnsibleModule @@ -91,7 +91,7 @@ def execute_show_command(command, module): 'output': 'json', } - return run_commands(module, command) + return run_commands(module, [command]) def apply_key_map(key_map, table): @@ -117,7 +117,9 @@ def flatten_list(command_lists): def get_snmp_groups(module): - data = execute_show_command('show snmp group', module)[0] + command = 'show snmp group' + data = execute_show_command(command, module)[0] + group_list = [] try: @@ -125,13 +127,14 @@ def get_snmp_groups(module): for group in group_table: group_list.append(group['role_name']) except (KeyError, AttributeError): - pass + return group_list return group_list def get_snmp_community(module, find_filter=None): - data = execute_show_command('show snmp community', module)[0] + command = 'show snmp community' + data = execute_show_command(command, module)[0] community_dict = {} @@ -222,7 +225,6 @@ def main(): delta = dict(set(proposed.items()).difference(existing.items())) commands = [] - if state == 'absent': if existing: command = "no snmp-server community {0}".format(community) @@ -237,7 +239,6 @@ def main(): results['changed'] = True if not module.check_mode: load_config(module, cmds) - if 'configure' in cmds: cmds.pop(0) results['commands'] = cmds @@ -247,3 +248,4 @@ def main(): if __name__ == '__main__': main() + diff --git a/lib/ansible/modules/network/nxos/nxos_snmp_contact.py b/lib/ansible/modules/network/nxos/nxos_snmp_contact.py index badba043a59..d6b1cfa1d4c 100644 --- a/lib/ansible/modules/network/nxos/nxos_snmp_contact.py +++ b/lib/ansible/modules/network/nxos/nxos_snmp_contact.py @@ -66,7 +66,7 @@ commands: import re -from ansible.module_utils.nxos import load_config, run_commands +from ansible.module_utils.nxos import get_config, load_config, run_commands from ansible.module_utils.nxos import nxos_argument_spec, check_args from ansible.module_utils.basic import AnsibleModule @@ -77,7 +77,7 @@ def execute_show_command(command, module): 'output': 'text', } - return run_commands(module, command) + return run_commands(module, [command]) def flatten_list(command_lists): @@ -92,12 +92,17 @@ def flatten_list(command_lists): def get_snmp_contact(module): contact = {} - contact_regex = r'^\s*snmp-server\scontact\s(?P.+)$' + contact_regex = '.*snmp-server\scontact\s(?P\S+).*' + command = 'show run snmp' - body = execute_show_command('show run snmp', module)[0] - match_contact = re.search(contact_regex, body, re.M) - if match_contact: - contact['contact'] = match_contact.group("contact") + body = execute_show_command(command, module)[0] + + try: + match_contact = re.match(contact_regex, body, re.DOTALL) + group_contact = match_contact.groupdict() + contact['contact'] = group_contact["contact"] + except AttributeError: + contact = {} return contact @@ -105,21 +110,25 @@ def get_snmp_contact(module): def main(): argument_spec = dict( contact=dict(required=True, type='str'), - state=dict(choices=['absent', 'present'], default='present'), + state=dict(choices=['absent', 'present'], + default='present') ) argument_spec.update(nxos_argument_spec) - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + module = AnsibleModule(argument_spec=argument_spec, + supports_check_mode=True) warnings = list() check_args(module, warnings) results = {'changed': False, 'commands': [], 'warnings': warnings} + contact = module.params['contact'] state = module.params['state'] existing = get_snmp_contact(module) + proposed = dict(contact=contact) commands = [] if state == 'absent': @@ -131,12 +140,11 @@ def main(): cmds = flatten_list(commands) if cmds: - results['changed'] = True if not module.check_mode: load_config(module, cmds) - if 'configure' in cmds: cmds.pop(0) + results['changed'] = True results['commands'] = cmds module.exit_json(**results) @@ -144,3 +152,4 @@ def main(): if __name__ == '__main__': main() + diff --git a/lib/ansible/modules/network/nxos/nxos_snmp_host.py b/lib/ansible/modules/network/nxos/nxos_snmp_host.py index 94ac7b9e17d..10e669f54cb 100644 --- a/lib/ansible/modules/network/nxos/nxos_snmp_host.py +++ b/lib/ansible/modules/network/nxos/nxos_snmp_host.py @@ -16,6 +16,7 @@ # along with Ansible. If not, see . # + ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ['preview'], 'supported_by': 'network'} @@ -83,6 +84,7 @@ options: required: true default: present choices: ['present','absent'] + ''' EXAMPLES = ''' @@ -91,29 +93,67 @@ EXAMPLES = ''' snmp_host: 3.3.3.3 community: TESTING state: present + host: "{{ inventory_hostname }}" + username: "{{ un }}" + password: "{{ pwd }}" ''' RETURN = ''' -commands: +proposed: + description: k/v pairs of parameters passed into module + returned: always + type: dict + sample: {"community": "TESTING", "snmp_host": "3.3.3.3", + "snmp_type": "trap", "version": "v2c", "vrf_filter": "one_more_vrf"} +existing: + description: k/v pairs of existing snmp host + returned: always + type: dict + sample: {"community": "TESTING", "snmp_type": "trap", + "udp": "162", "v3": "noauth", "version": "v2c", + "vrf": "test_vrf", "vrf_filter": ["test_vrf", + "another_test_vrf"]} +end_state: + description: k/v pairs of switchport after module execution + returned: always + type: dict + sample: {"community": "TESTING", "snmp_type": "trap", + "udp": "162", "v3": "noauth", "version": "v2c", + "vrf": "test_vrf", "vrf_filter": ["test_vrf", + "another_test_vrf", "one_more_vrf"]} +updates: description: commands sent to the device returned: always type: list sample: ["snmp-server host 3.3.3.3 filter-vrf another_test_vrf"] +changed: + description: check to see if a change was made on the device + returned: always + type: boolean + sample: true ''' -from ansible.module_utils.nxos import load_config, run_commands +from ansible.module_utils.nxos import get_config, load_config, run_commands from ansible.module_utils.nxos import nxos_argument_spec, check_args from ansible.module_utils.basic import AnsibleModule -def execute_show_command(command, module): - command = { - 'command': command, - 'output': 'json', - } +import re +import re - return run_commands(module, command) + +def execute_show_command(command, module, command_type='cli_show'): + if module.params['transport'] == 'cli': + if 'show run' not in command: + command += ' | json' + cmds = [command] + body = run_commands(module, cmds) + elif module.params['transport'] == 'nxapi': + cmds = [command] + body = run_commands(module, cmds) + + return body def apply_key_map(key_map, table): @@ -129,18 +169,9 @@ def apply_key_map(key_map, table): return new_dict -def flatten_list(command_lists): - flat_command_list = [] - for command in command_lists: - if isinstance(command, list): - flat_command_list.extend(command) - else: - flat_command_list.append(command) - return flat_command_list - - def get_snmp_host(host, module): - body = execute_show_command('show snmp host', module) + command = 'show snmp host' + body = execute_show_command(command, module) host_map = { 'port': 'udp', @@ -161,19 +192,19 @@ def get_snmp_host(host, module): for each in resource_table: key = str(each['host']) - src = each.get('src_intf') + src = each.get('src_intf', None) host_resource = apply_key_map(host_map, each) if src: host_resource['src_intf'] = src.split(':')[1].strip() - vrf_filt = each.get('TABLE_vrf_filters') + vrf_filt = each.get('TABLE_vrf_filters', None) if vrf_filt: vrf_filter = vrf_filt['ROW_vrf_filters']['vrf_filter'].split(':')[1].split(',') filters = [vrf.strip() for vrf in vrf_filter] host_resource['vrf_filter'] = filters - vrf = each.get('vrf') + vrf = each.get('vrf', None) if vrf: host_resource['vrf'] = vrf.split(':')[1].strip() resource[key] = host_resource @@ -181,7 +212,7 @@ def get_snmp_host(host, module): except (KeyError, AttributeError, TypeError): return resource - find = resource.get(host) + find = resource.get(host, None) if find: fix_find = {} @@ -191,8 +222,10 @@ def get_snmp_host(host, module): else: fix_find[key] = value return fix_find - - return {} + else: + return {} + else: + return {} def remove_snmp_host(host, existing): @@ -218,10 +251,10 @@ def config_snmp_host(delta, proposed, existing, module): host = proposed['snmp_host'] cmd = 'snmp-server host {0}'.format(proposed['snmp_host']) - snmp_type = delta.get('snmp_type') - version = delta.get('version') - ver = delta.get('v3') - community = delta.get('community') + snmp_type = delta.get('snmp_type', None) + version = delta.get('version', None) + ver = delta.get('v3', None) + community = delta.get('community', None) command_builder.append(cmd) if any([snmp_type, version, ver, community]): @@ -258,14 +291,26 @@ def config_snmp_host(delta, proposed, existing, module): 'src_intf': 'snmp-server host {0} source-interface {src_intf}' } - for key in delta: - command = CMDS.get(key) - if command: - cmd = command.format(host, **delta) - commands.append(cmd) + for key, value in delta.items(): + if key in ['vrf_filter', 'vrf', 'udp', 'src_intf']: + command = CMDS.get(key, None) + if command: + cmd = command.format(host, **delta) + commands.append(cmd) + cmd = None return commands +def flatten_list(command_lists): + flat_command_list = [] + for command in command_lists: + if isinstance(command, list): + flat_command_list.extend(command) + else: + flat_command_list.append(command) + return flat_command_list + + def main(): argument_spec = dict( snmp_host=dict(required=True, type='str'), @@ -282,11 +327,13 @@ def main(): argument_spec.update(nxos_argument_spec) - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + module = AnsibleModule(argument_spec=argument_spec, + supports_check_mode=True) warnings = list() check_args(module, warnings) - results = {'changed': False, 'commands': [], 'warnings': warnings} + + snmp_host = module.params['snmp_host'] community = module.params['community'] @@ -297,6 +344,7 @@ def main(): vrf_filter = module.params['vrf_filter'] vrf = module.params['vrf'] snmp_type = module.params['snmp_type'] + state = module.params['state'] if snmp_type == 'inform' and version != 'v3': @@ -321,49 +369,67 @@ def main(): # existing returns the list of vrfs configured for a given host # checking to see if the proposed is in the list - store = existing.get('vrf_filter') + store = existing.get('vrf_filter', None) if existing and store: if vrf_filter not in existing['vrf_filter']: existing['vrf_filter'] = None else: existing['vrf_filter'] = vrf_filter - commands = [] - if state == 'absent' and existing: - command = remove_snmp_host(snmp_host, existing) - commands.append(command) - - elif state == 'present': - args = dict( - community=community, - snmp_host=snmp_host, - udp=udp, - version=version, - src_intf=src_intf, - vrf_filter=vrf_filter, - v3=v3, - vrf=vrf, - snmp_type=snmp_type + args = dict( + community=community, + snmp_host=snmp_host, + udp=udp, + version=version, + src_intf=src_intf, + vrf_filter=vrf_filter, + v3=v3, + vrf=vrf, + snmp_type=snmp_type ) - proposed = dict((k, v) for k, v in args.items() if v is not None) - delta = dict(set(proposed.items()).difference(existing.items())) + proposed = dict((k, v) for k, v in args.items() if v is not None) + + delta = dict(set(proposed.items()).difference(existing.items())) + + changed = False + commands = [] + end_state = existing + + if state == 'absent': + if existing: + command = remove_snmp_host(snmp_host, existing) + commands.append(command) + elif state == 'present': if delta: command = config_snmp_host(delta, proposed, existing, module) commands.append(command) cmds = flatten_list(commands) if cmds: - results['changed'] = True - if not module.check_mode: + if module.check_mode: + module.exit_json(changed=True, commands=cmds) + else: + changed = True load_config(module, cmds) + end_state = get_snmp_host(snmp_host, module) + if 'configure' in cmds: + cmds.pop(0) - if 'configure' in cmds: - cmds.pop(0) - results['commands'] = cmds + if store: + existing['vrf_filter'] = store + + results = {} + results['proposed'] = proposed + results['existing'] = existing + results['end_state'] = end_state + results['updates'] = cmds + results['changed'] = changed + results['warnings'] = warnings module.exit_json(**results) -if __name__ == '__main__': +if __name__ == "__main__": main() + diff --git a/lib/ansible/modules/network/nxos/nxos_snmp_location.py b/lib/ansible/modules/network/nxos/nxos_snmp_location.py index 52604148e0a..bd728c4f7ba 100644 --- a/lib/ansible/modules/network/nxos/nxos_snmp_location.py +++ b/lib/ansible/modules/network/nxos/nxos_snmp_location.py @@ -16,6 +16,7 @@ # along with Ansible. If not, see . # + ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ['preview'], 'supported_by': 'network'} @@ -32,8 +33,6 @@ description: author: - Jason Edelman (@jedelman8) - Gabriele Gerbino (@GGabriele) -notes: - - Tested against NXOSv 7.3.(0)D1(1) on VIRL options: location: description: @@ -61,7 +60,7 @@ EXAMPLES = ''' RETURN = ''' commands: - description: commands sent to the device + description: command sent to the device returned: always type: list sample: ["snmp-server location New_Test"] @@ -70,18 +69,36 @@ commands: import re -from ansible.module_utils.nxos import load_config, run_commands +from ansible.module_utils.nxos import get_config, load_config, run_commands from ansible.module_utils.nxos import nxos_argument_spec, check_args from ansible.module_utils.basic import AnsibleModule -def execute_show_command(command, module): - command = { - 'command': command, - 'output': 'text', - } +def execute_show_command(command, module, command_type='cli_show'): + if 'show run' not in command: + cmds = [{ + 'command': command, + 'output': 'json', + }] + else: + cmds = [{ + 'command': command, + 'output': 'text', + }] - return run_commands(module, command) + return run_commands(module, cmds) + + +def apply_key_map(key_map, table): + new_dict = {} + for key, value in table.items(): + new_key = key_map.get(key) + if new_key: + if value: + new_dict[new_key] = str(value) + else: + new_dict[new_key] = value + return new_dict def flatten_list(command_lists): @@ -96,12 +113,16 @@ def flatten_list(command_lists): def get_snmp_location(module): location = {} - location_regex = r'^\s*snmp-server\slocation\s(?P.+)$' + location_regex = '.*snmp-server\slocation\s(?P\S+).*' + command = 'show run snmp' - body = execute_show_command('show run snmp', module)[0] - match_location = re.search(location_regex, body, re.M) - if match_location: - location['location'] = match_location.group("location") + body = execute_show_command(command, module, command_type='cli_show_ascii') + try: + match_location = re.match(location_regex, body[0], re.DOTALL) + group_location = match_location.groupdict() + location['location'] = group_location["location"] + except (AttributeError, TypeError): + location = {} return location @@ -109,7 +130,7 @@ def get_snmp_location(module): def main(): argument_spec = dict( location=dict(required=True, type='str'), - state=dict(choices=['absent', 'present'], default='present'), + state=dict(choices=['absent', 'present'], default='present') ) argument_spec.update(nxos_argument_spec) @@ -118,13 +139,15 @@ def main(): warnings = list() check_args(module, warnings) - results = {'changed': False, 'commands': [], 'warnings': warnings} + results = {'commands': [], 'changed': False, 'warnings': warnings} location = module.params['location'] state = module.params['state'] existing = get_snmp_location(module) commands = [] + proposed = dict(location=location) + end_state = existing if state == 'absent': if existing and existing['location'] == location: @@ -135,16 +158,16 @@ def main(): cmds = flatten_list(commands) if cmds: - results['changed'] = True if not module.check_mode: load_config(module, cmds) if 'configure' in cmds: cmds.pop(0) results['commands'] = cmds + results['changed'] = True module.exit_json(**results) -if __name__ == '__main__': +if __name__ == "__main__": main()