Ansible, как сохранить вывод регистра в списке при итерации по инвентарю

Я запускаю команду оболочки, эта команда выполняется для всех хостов, перечисленных в моем файле инвентаризации. Затем я использую регистр для определения переменной, когда я получаю эти значения для сообщений отладки, я вижу регистровую переменную для всех хостов, напечатанных для всех IP-адресов в моем инвентаре, но я хочу сохранить их в списке, чтобы я мог использовать их в шаблонах. Как мы можем этого добиться?

- name: Command
    shell: hostname -f
    register: fqdn_name


person Nik    schedule 20.12.2018    source источник
comment
также вставьте результат вашей регистрации, чтобы мы вам помогли   -  person Arbab Nazar    schedule 20.12.2018


Ответы (1)


Что касается вашего конкретного вопроса, вы делаете больше работы, чем вам нужно. Каждый раз, когда Ansible сталкивается с хостом, он собирает серию «фактов» о хосте и сохраняет их в словаре, доступном во время ваших игр. Поэтому замените существующую задачу Command следующей, чтобы понять, что я имею в виду:

- name: Display the Ansible FQDN fact
  debug:
    var: ansible_fqdn

Запуск ansible -m setup <hostname taken from inventory file> покажет вам все собираемые переменные.

Переменные для всех ваших хостов доступны через специальный словарь под названием hostvars, поэтому в вашем шаблоне вы можете сделать что-то вроде этого:

{% for host in groups.all %}
{{ hostvars[host]['ansible_fqdn'] }}
{% endfor %}

Вы можете заменить groups.all на groups.<some inventory groupname>, чтобы ограничить совпадающие хосты определенной группой.

Одна из возможных проблем заключается в том, что эти факты будут собраны только в том случае, если Ansible уже нацелен на хост, поэтому одна стратегия для более сложных сценариев:

# This play simply connects to all your hosts and gathers facts
- hosts: all
  gather_facts: yes

# Now all subsequent plays have access to facts for all hosts
- hosts: <all or some group>
  tasks: ...
person clockworknet    schedule 20.12.2018