使用ansible过滤输出

Filter output with ansible

所以我正在使用 ansible 连接到互连设备 运行 PicOS8。我正在发出具有以下输出的命令:

10.240.18.20,fe80::a94:efff:fe50:b516%eth0
fe80::a94:efff:fe71:d996%vlan.4,10.240.23.34
fe80::a94:efff:fe71:daa6%vlan.4,10.240.23.

这并不总是标准的,因为有时 ipv4 地址先于 ipv6,或者有时根本没有 ipv6。

我正在使用 ansible register 注册此输出,假设为 smm_output.

然后我想显示输出,只显示 ipv4 ip 地址(使用下面的剧本):

   - debug:
       msg: "{{ smm_output.stdout_lines | ipv4('address') }}"

但输出为空白。不确定我在这里做错了什么或如何从该输出中严格显示 ipv4 ip 地址。

你必须遍历列表stdout_lines并将字符串拆分到列表中。试试这个:

- debug:
    msg: "{{ item.split(',') | ipv4('address') }}"
  loop: "{{smm_output.stdout_lines}}"

您也可以仅使用 IPv4 创建单独的数组

- set_fact:
    ip4: []

- set_fact:
    ip4: "{{ ip4 + (item.split(',') | ipv4('address') )}}"
  loop: "{{smm_output.stdout_lines}}"

- debug:
    var: ip4

应该生成以下输出:

TASK [debug] ***********************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "ip4": [
        "10.240.18.20",
        "10.240.23.34"
    ]
}