从 Ansible 输出中过滤掉内容

Filter out content from Ansible output

我想从 ansible 输出中单独过滤掉 ip 地址。当我尝试使用 awk 命令过滤掉时,它失败了。请查看我的代码、输出和所需的输出。

    - name: Gather all VMs from a specific folder
      community.vmware.vmware_vm_info:
        hostname: hostname_local
        username: vmwarelogin
        password: passwordvmware
        folder: "/VMFS/"
        validate_certs: False
      delegate_to: localhost
      register: vm_info
    - debug:
        var: ip
      vars:
        ip: "{{ vm_info.virtual_machines|
                selectattr('guest_name', 'eq', 'My-Machine')|
                map(attribute='ip_address')|first }}"
      register: ip
    - name: add ip
      shell: echo "{{ip}}"| awk '{print }'

运行以上代码后的输出

{'ip': '192.168.1.32', 'failed': False, 'changed': False}

预期输出为

192.168.1.32

如果能将此 IP 地址用作同一剧本中其他地方的变量,我们将不胜感激

如果我理解您想使用 YAML 标签传达的意思,您就是在暗示

{'ip': '192.168.1.32', 'failed': False, 'changed': False}

应被视为 YAML 文件。如果是这种情况,如果允许,您应该使用 YAML 解析器,如果您想要可以用作流水线命令的一部分的解析器,那么我建议尝试 yq。如果你被迫为此使用 AWK 那么请注意它最适合处理属于 Chomsky Type-3 的实体,而 YAML 不是 Chomsky Type-3 的装置。无论如何,它可能足以满足您的情况。我建议遵循以下启发式:获取第一个看起来像十进制 IP 地址的东西,这可以按照 GNU 中的方式完成 AWK 假设您正在使用标准输入来传递

{'ip': '192.168.1.32', 'failed': False, 'changed': False}

然后

awk 'BEGIN{FPAT="[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}"}{print }'

输出

192.168.1.32

解释:我使用字段模式(FPAT)来通知 GNU AWK 字段是 1 到 3 位数字后跟文字点,然后是 1 到 3 位数字,然后是点,然后是 1 到3 位数字后跟点,然后是 1 到 3 位数字。请注意,这确实只考虑了十进制表示法中的 IP 地址,也可能会产生误报(例如,它会找到 999.999.999.999),但希望您的输入不是恶意的。我 print 为每一行找到第一个这样的字段。

(在 gawk 4.2.1 中测试)

关于如何

... use this IP address as a variable for other places in the same playbook?

并查看提供的示例,您可以按照以下方式简化您的案例

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:
    IP: "192.168.2.1"

  tasks:

  - name: Show vars
    debug:
      var: IP
    register: result

  - name: Show result
    debug:
      var: result

  - name: Show IP
    debug:
      msg: "{{ result.IP }}"

只需在您的案例中使用 finally echo "{{ ip.ip }}"

I want to filter out IP address alone from the Ansible output.

根本不需要 awk,因为内容已经存在并且可以直接访问。

Expected output is ...

结果如你所愿

TASK [Show vars] ***
ok: [localhost] =>
  IP: 192.168.2.1

TASK [Show result] ***
ok: [localhost] =>
  result:
    IP: 192.168.2.1
    changed: false
    failed: false

TASK [Show IP] ***
ok: [localhost] =>
  msg: 192.168.2.1

更多文档