从 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
更多文档
我想从 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
更多文档