diff --git a/changelogs/fragments/update_nxos_cliconf_for_mds.yaml b/changelogs/fragments/update_nxos_cliconf_for_mds.yaml new file mode 100644 index 00000000000..370230b8c32 --- /dev/null +++ b/changelogs/fragments/update_nxos_cliconf_for_mds.yaml @@ -0,0 +1,2 @@ +bugfixes: + - Update NX-OS cliconf to accomodate MDS (https://github.com/ansible-collections/cisco.nxos/pull/78). diff --git a/lib/ansible/plugins/cliconf/nxos.py b/lib/ansible/plugins/cliconf/nxos.py index 207b824f8da..47f6d8720f3 100644 --- a/lib/ansible/plugins/cliconf/nxos.py +++ b/lib/ansible/plugins/cliconf/nxos.py @@ -46,6 +46,7 @@ class Cliconf(CliconfBase): def __init__(self, *args, **kwargs): self._module_context = {} + self._device_info = {} super(Cliconf, self).__init__(*args, **kwargs) def read_module_context(self, module_key): @@ -60,52 +61,55 @@ class Cliconf(CliconfBase): return None def get_device_info(self): - device_info = {} + if not self._device_info: + device_info = {} - device_info['network_os'] = 'nxos' - reply = self.get('show version') - platform_reply = self.get('show inventory') + device_info['network_os'] = 'nxos' + reply = self.get('show version') + platform_reply = self.get('show inventory') - match_sys_ver = re.search(r'\s+system:\s+version\s*(\S+)', reply, re.M) - if match_sys_ver: - device_info['network_os_version'] = match_sys_ver.group(1) - else: - match_kick_ver = re.search(r'\s+kickstart:\s+version\s*(\S+)', reply, re.M) - if match_kick_ver: - device_info['network_os_version'] = match_kick_ver.group(1) - - if 'network_os_version' not in device_info: - match_sys_ver = re.search(r'\s+NXOS:\s+version\s*(\S+)', reply, re.M) + match_sys_ver = re.search(r'\s+system:\s+version\s*(\S+)', reply, re.M) if match_sys_ver: device_info['network_os_version'] = match_sys_ver.group(1) + else: + match_kick_ver = re.search(r'\s+kickstart:\s+version\s*(\S+)', reply, re.M) + if match_kick_ver: + device_info['network_os_version'] = match_kick_ver.group(1) - match_chassis_id = re.search(r'Hardware\n\s+cisco(.+)$', reply, re.M) - if match_chassis_id: - device_info['network_os_model'] = match_chassis_id.group(1).strip() + if 'network_os_version' not in device_info: + match_sys_ver = re.search(r'\s+NXOS:\s+version\s*(\S+)', reply, re.M) + if match_sys_ver: + device_info['network_os_version'] = match_sys_ver.group(1) - match_host_name = re.search(r'\s+Device name:\s*(\S+)', reply, re.M) - if match_host_name: - device_info['network_os_hostname'] = match_host_name.group(1) + match_chassis_id = re.search(r'Hardware\n\s+cisco(.+)$', reply, re.M) + if match_chassis_id: + device_info['network_os_model'] = match_chassis_id.group(1).strip() - match_isan_file_name = re.search(r'\s+system image file is:\s*(\S+)', reply, re.M) - if match_isan_file_name: - device_info['network_os_image'] = match_isan_file_name.group(1) - else: - match_kick_file_name = re.search(r'\s+kickstart image file is:\s*(\S+)', reply, re.M) - if match_kick_file_name: - device_info['network_os_image'] = match_kick_file_name.group(1) + match_host_name = re.search(r'\s+Device name:\s*(\S+)', reply, re.M) + if match_host_name: + device_info['network_os_hostname'] = match_host_name.group(1) - if 'network_os_image' not in device_info: - match_isan_file_name = re.search(r'\s+NXOS image file is:\s*(\S+)', reply, re.M) + match_isan_file_name = re.search(r'\s+system image file is:\s*(\S+)', reply, re.M) if match_isan_file_name: device_info['network_os_image'] = match_isan_file_name.group(1) + else: + match_kick_file_name = re.search(r'\s+kickstart image file is:\s*(\S+)', reply, re.M) + if match_kick_file_name: + device_info['network_os_image'] = match_kick_file_name.group(1) - match_os_platform = re.search(r'NAME: "Chassis",\s*DESCR:.*\n' - r'PID:\s*(\S+)', platform_reply, re.M) - if match_os_platform: - device_info['network_os_platform'] = match_os_platform.group(1) + if 'network_os_image' not in device_info: + match_isan_file_name = re.search(r'\s+NXOS image file is:\s*(\S+)', reply, re.M) + if match_isan_file_name: + device_info['network_os_image'] = match_isan_file_name.group(1) - return device_info + match_os_platform = re.search(r'NAME: "Chassis",\s*DESCR:.*\n' + r'PID:\s*(\S+)', platform_reply, re.M) + if match_os_platform: + device_info['network_os_platform'] = match_os_platform.group(1) + + self._device_info = device_info + + return self._device_info def get_diff(self, candidate=None, running=None, diff_match='line', diff_ignore_lines=None, path=None, diff_replace='line'): diff = {} @@ -282,7 +286,13 @@ class Cliconf(CliconfBase): raise ValueError("'output' value %s is invalid. Valid values are %s" % (output, ','.join(options_values['output']))) if output == 'json' and not command.endswith('| json'): - cmd = '%s | json' % command + device_info = self.get_device_info() + model = device_info.get("network_os_model", "") + platform = device_info.get("network_os_platform", "") + if platform.startswith("DS-") and "MDS" in model: + cmd = "%s | json native" % command + else: + cmd = "%s | json" % command elif output == 'text' and command.endswith('| json'): cmd = command.rsplit('|', 1)[0] else: