我正在尝试获取多个 ESXi 主机上的所有数据存储的列表(它们都位于不同的 vCenter,因此我必须使用带有字典的循环来获取 ESXi 主机的正确 vCenter,否则主机不会出现)
我的问题是试图理解输出。我读过文档,但似乎找不到一个清晰的方法来获得我想要的输出。请考虑文档中的以下内容作为工作示例 - 在一个 ESXi 主机上。
- name: Gather vmware host facts from vCenter
vmware_host_facts:
hostname: "{{ vcenter_server }}"
username: "{{ vcenter_user }}"
password: "{{ vcenter_pass }}"
esxi_hostname: "{{ esxi_hostname }}"
register: host_facts
delegate_to: localhost
- debug:
var: host_facts['ansible_facts']['ansible_datastore']
在我的示例中,我添加了一个循环来获取正确的组合:
- name: Gather vmware host facts from vCenter
vmware_host_facts:
hostname: "{{ item.vcs }}"
username: "{{ vcenter_user }}"
password: "{{ vcenter_pass }}"
esxi_hostname: "{{ item.host }}"
register: host_facts
delegate_to: localhost
loop:
- { host: 'mtboskt1bl07.oam.eeint.co.uk', vcs: 'vmtvcsakt01.oam.eeint.co.uk' }
- { host: 'mtaoskt1bl10.oam.eeint.co.uk', vcs: 'vmtvcsakt01.oam.eeint.co.uk' }
变量“host_facts”是一个包含三个条目的字典:信息,已更改和结果。
如果我访问结果- 这是一份字典列表,但我似乎无法访问任何条目。
我查看了“子元素”文档,但不知道该如何在这里应用它。有人能进一步帮助我吗?
答案1
您所指的元素是results
(带 的复数s
),如文档
当您在具有循环的任务中注册变量时,注册的变量将包含循环中每一项的值。循环期间放置在变量中的数据结构将包含一个
results
属性,即模块的所有响应的列表。有关其工作原理的更深入的示例,请参阅循环关于使用寄存器循环的部分。
在您的例子中,循环包含两次迭代。以上面的 var 示例为例,第一次迭代的循环等效于:
- debug:
var: host_facts.results[0].ansible_facts.ansible_datastore
如果您想要获取上一个循环收集的所有数据存储,您可以循环结果:
- debug:
var: item.ansible_facts.ansible_datastore
loop: "{{ host_facts.results }}"