Я пытаюсь получить список всех хранилищ данных на нескольких хостах ESXi (все они находятся в разных vCenters, поэтому мне приходится использовать цикл со словарем, чтобы получить правильный vCenter для хоста ESXi, иначе хосты не будут появляются)
Моя проблема в том, чтобы понять вывод. Я прочитал документацию и, похоже, не могу найти четкого способа получить желаемый результат. Рассмотрим в качестве рабочего примера следующее из документации - на одном хосте 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' }
Var 'host_facts' - это словарь, содержащий три записи: сообщение, изменено и результат.
Если я получу доступ результат - это список словарей, но я не могу получить доступ к записям.
Я просмотрел документацию по «подэлементу», но не понимаю, как бы применить его здесь. Кто-нибудь может мне помочь?
Вы имеете в виду элемент 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 }}"