从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 $2}'

运行上述代码后的输出

{'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地址的东西,这可以在GNUAWK中以以下方式完成假设您使用标准输入来传递

{'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 $1}'

输出
192.168.1.32

解释:我使用字段模式(FPAT)来通知GNUAWK,字段是1到3个数字后面跟着文字点,然后是1到3个数字,然后是点,然后是1到3个数字,然后是点,最后是1到3个数字。请注意,这只考虑十进制记数的IP地址,也可能给出误报(例如,它会找到999.999.999.999),但希望你的输入不是如此恶意。Iprint为每行找到的第一个这样的字段。

(在gawk 4.2.1中测试)

关于如何

…使用这个IP地址作为变量在同一剧本的其他地方?

和查看所提供的示例,看起来您可以将案例简化如下:

---
- 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 }}"

只要在你的情况下使用finallyecho "{{ ip.ip }}"

我想从Ansible输出中单独过滤出IP地址。

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

预期输出是…

结果将符合要求

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

进一步文档

<
  • 注册变量/gh><
  • 字典变量/gh>
  • debug模块-打印执行过程中的语句

最新更新