Назад | Перейти на главную страницу

Ansible vmware_host_facts с циклом

Я пытаюсь получить список всех хранилищ данных на нескольких хостах 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 }}"