如何正确管理网络设备的 Ansible 正则表达式

如何正确管理网络设备的 Ansible 正则表达式

我目前正在测试使用 arubanetworks.aos_switch 集合检索 HP/Aruba 交换机上的固件版本列表。基本上我只是在做:

  collections:
    - arubanetworks.aos_switch
  
  tasks:
    - name: Launching "show flash" CLI
      arubaoss_command:
        commands:
          - "show flash"
 
      register: output_version
 
 
    - name: Firmware Display
      debug:
         msg: "{{ output_version.stdout_lines }}"

以下是我从 stdout 和 stdout_lines 角度使用 -vvv 选项启动剧本时检索到的内容:

    "stdout": [
        "show flashImage             Size (bytes) Date     Version \n----------------- ------------ -------- --------------\nPrimary Image    :    14184498 04/14/17 YA.16.03.0004        \nSecondary Image  :    14184498 04/14/17 YA.16.03.0004       \n\nBoot ROM Version \n----------------\nPrimary Boot ROM Version   : YA.15.19\b\nDefault Boot Image   : Primary"
    ],
    "stdout_lines": [
        [
            "show flashImage             Size (bytes) Date     Version ",
            "----------------- ------------ -------- --------------",
            "Primary Image    :    14184498 04/14/17 YA.16.03.0004        ",
            "Secondary Image  :    14184498 04/14/17 YA.16.03.0004       ",
            "",
            "Boot ROM Version ",
            "----------------",
            "Primary Boot ROM Version   : YA.15.19",
            "",
            "Default Boot Image   : Primary"
        ]
    ]
}

如果我在标准输出上使用以下正则表达式msg: "{{ output_version.stdout | regex_findall('(Primary Image[^\\\\n]*)')}}",我会成功检索到一行结果,例如:“主要图像:14184498 04/14/17 YA.16.03.0004”

我的主要问题是,因为它不是 JSON 格式的输出,正确检索这些数据的最佳和最简单的方法是什么?将来,我想将其存储在一个文件中,基本上类似于主机名;闪存图像;大小;日期;版本

非常感谢你的建议。Gael

答案1

您可以使用过滤器和测试从stdout_lines与正则表达式匹配的行中提取单独的行。例如:selectmatch

- hosts: localhost
  gather_facts: false
  vars:
    output_version:
      stdout: "show flashImage             Size (bytes) Date     Version \n----------------- ------------ -------- --------------\nPrimary Image    :    14184498 04/14/17 YA.16.03.0004        \nSecondary Image  :    14184498 04/14/17 YA.16.03.0004       \n\nBoot ROM Version \n----------------\nPrimary Boot ROM Version   : YA.15.19\b\nDefault Boot Image   : Primary"
      stdout_lines: [
          [
              "show flashImage             Size (bytes) Date     Version ",
              "----------------- ------------ -------- --------------",
              "Primary Image    :    14184498 04/14/17 YA.16.03.0004        ",
              "Secondary Image  :    14184498 04/14/17 YA.16.03.0004       ",
              "",
              "Boot ROM Version ",
              "----------------",
              "Primary Boot ROM Version   : YA.15.19",
              "",
              "Default Boot Image   : Primary"
          ]
      ]

  tasks:
    - name: extract primary image
      set_fact:
        primary_image: >-
          {{ (output_version.stdout_lines[0] | select("match", "Primary Image") | first | split(":"))[1].strip().split() }}
        secondary_image: >-
          {{ (output_version.stdout_lines[0] | select("match", "Secondary Image") | first | split(":"))[1].strip().split() }}

    - debug:
        msg:
          - "{{ primary_image }}"
          - "{{ secondary_image }}"

如果我们运行上述剧本,我们会得到以下输出:

TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        [
            "14184498",
            "04/14/17",
            "YA.16.03.0004"
        ],
        [
            "14184498",
            "04/14/17",
            "YA.16.03.0004"
        ]
    ]
}

这并不意味着您拥有结构化的数据,您可以按照自己认为合适的方式存储它。

相关内容