使用 ansible 访问字典文件的 yaml 列表
Posted
技术标签:
【中文标题】使用 ansible 访问字典文件的 yaml 列表【英文标题】:Access yaml list of dictionaries file with ansible 【发布时间】:2021-12-12 15:10:28 【问题描述】:所以我尝试从文件中获取值,我们称之为“test.yaml”
文件看起来像这样(对不起,输出很长,但它是包含所有模式和结构的最短路径):
---
results:
- failed: false
item: XXX.XX.XX.XX
invocation:
module_args:
validate_certs: false
vm_type: vm
show_tag: false
username: DOMAIN\domain-user
proxy_host:
proxy_port:
show_attribute: false
password: VALUE_SPECIFIED_IN_NO_LOG_PARAMETER
port: XXX
folder:
hostname: XXX.XX.XX.XX
changed: false
virtual_machines:
- ip_address: XXX.XX.XX.XX
mac_address:
- XX:XX:XX:aa:XX:XX
uuid: XXXX-XX-XX-XXXX-XXXXX
guest_fullname: Red Hat Enterprise Linux X (XX-bit)
moid: vm-XXX
folder: "/DOMAIN-INTERXION/vm"
cluster:
attributes:
power_state: poweredOn
esxi_hostname: esx.hostname
tags: []
guest_name: VMnameXX
vm_network:
XX:XX:XX:aa:XX:XX:
ipv6:
- XX::XXX:XX:XXXX
ipv4:
- XXX.XX.XX.XX
例如,我想拥有类似的东西:
results.invocation.virtual_machines.ip_address
results.invocation.module_args.user_name
我尝试了各种方法,但都不起作用:)
最后一次尝试是这样的:
---
- name: demo how register works
hosts: localhost
tasks:
- name: Include all .json and .jsn files in vars/all and all nested directories (2.3)
include_vars:
file: test.yml
name: vm
- name: debug
debug:
msg: " item.0.item "
with_subelements:
- " vm.results "
- virtual_machines
register: subelement
【问题讨论】:
我建议您查看learnxinyminutes.com/docs/yaml,以加深您的 YAML 语法知识。但基本上,当一个缩进级别以-
开头时,它是一个数组,当它以一个键(例如invocation
)开头时,它就是一个对象。所以,results
和 virtual_machines
是数组,应该作为数组寻址:results.0.invocation.virtual_machines.0.ip_address
和 results.0.invocation.module_args.user_name
【参考方案1】:
遵循您的结构并修复一些错误后:
results.invocation.virtual_machines.ip_address 是 results[0].virtual_machines[0].ip_address 和 results.invocation.module_args.user_name 是 results[0].invocation.module_args.username
(results和virtual_machines是数组,写results[0]或者results.0是一样的)
所以一个剧本做工作的样本:
- name: vartest
hosts: localhost
tasks:
- name: Include all .json and .jsn files in vars/all and all nested directories (2.3)
include_vars:
file: test.yml
name: vm
- name: ip
set_fact:
ipadress: " vm.results[0].virtual_machines[0].ip_address "
- name: username
set_fact:
username: " vm.results[0].invocation.module_args.username "
- name: display
debug:
msg: "ip: ipadress and username: username "
结果:
ok: [localhost] =>
msg: 'ip: XXX.XX.XX.XX and username: DOMAIN\domain-user'
【讨论】:
谢谢,但这并不是我想要的。这个文件要大得多。我想循环浏览所有虚拟机的信息。 精确你的结构不清楚以上是关于使用 ansible 访问字典文件的 yaml 列表的主要内容,如果未能解决你的问题,请参考以下文章