使用Ansible解析Cisco IOS的show version元数据返回null如何解决
问题根因
1. 变量引用错误
你通过pattern_match注册的变量(如name、image等)是直接作用于当前parser上下文的,不属于行对象item的属性。你在json_template中全部用item.xxx.matches的方式取值,自然无法获取到任何匹配结果,这是所有字段返回null的核心原因。
2. 未配置逐行拆分规则
pattern_group默认会将传入的完整show version输出作为单个匹配对象,你所有带行首锚点^的正则,只能匹配整个文本的第一行,无法命中后面行的内容。需要添加split: lines配置,将输入文本按换行拆分为独立行逐行匹配。
3. FastEthernet匹配规则与实际输出不符
你的正则写的是匹配复数形式FastEthernet interfaces,但实际返回结果里只有1个FastEthernet口,输出为单数形式1 FastEthernet interface,正则无法匹配导致结果为空。
4. 部分正则边界处理不严谨
比如镜像路径的匹配规则System image file is (\S+),实际输出中路径被双引号包裹,该规则会把引号也一同捕获,不过这个问题不会导致返回null,只会让结果多带无关的引号。
修复后的show_version.yaml示例
--- - name: parser meta data parser_metadata: version: 1.0 command: show version network_os: cisco.ios.ios - name: match version values pattern_group: split: lines # 新增逐行拆分配置 - name: match name pattern_match: regex: "^(\\S+) uptime is" content: "{{ item }}" register: name - name: match IMAGE FILE pattern_match: regex: 'System image file is "(\S+)"' # 适配引号边界 content: "{{ item }}" register: image - name: match VIRTUAL INTERFACES pattern_match: regex: "^(\\S+) Virtual Ethernet interfaces" content: "{{ item }}" register: virethint - name: match GIGABIT INTERFACES pattern_match: regex: "^(\\S+) Gigabit Ethernet interfaces" content: "{{ item }}" register: gigethint - name: match FAST INTERFACES pattern_match: regex: "^(\\S+) FastEthernet interface" # 修改为单数适配1个端口的场景 content: "{{ item }}" register: fastethint - name: match SERIAL NUMBER pattern_match: regex: "System serial number.*: (\\S+)" content: "{{ item }}" register: SN - name: match MODEL NUMBER pattern_match: regex: "Model number.*: (\\S+)" content: "{{ item }}" register: MODEL - name: match VERSION pattern_match: regex: "Cisco IOS Software, .+Version (\\S+)," content: "{{ item }}" register: version - name: generate json data structure json_template: template: - key: "{{ name.matches.0 }}" # 去掉错误的item前缀 object: - key: element object: - key: name value: "{{ name.matches.0 }}" - key: image value: "{{ image.matches.0 }}" - key: virethint value: "{{ virethint.matches.0 }}" - key: gigethint value: "{{ gigethint.matches.0 }}" - key: fastethint value: "{{ fastethint.matches.0 }}" - key: SN value: "{{ SN.matches.0 }}" - key: MODEL value: "{{ MODEL.matches.0 }}" - key: version value: "{{ version.matches.0 }}" export: yes register: version_facts
如果要兼容1个以上FastEthernet口的场景,可以把FastEthernet的正则修改为"^(\\S+) FastEthernet interfaces?",末尾加?兼容单复数形式。
内容的提问来源于stack exchange,提问作者Cheikh Ahmed Tidiane FALL
相关产品推荐
相关产品推荐

