You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:36:03