Как получить доступ к переменной хоста другого хоста с Ansible?


45

Допустим, есть хост, который собирает некоторые данные, и он находится в группе [collectors]. У меня также есть хозяева в группе [reporters]. Поэтому я хочу установить переменную для журналистов с groups['collectors'][0]IP-адреса. Но книга по настройке репортеров не работает в [collectors]группе, поэтому факты для этого хоста не собираются. Есть ли способ не жестко закодировать IP-адрес?

Ответы:


87

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

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

или, если вы хотите сделать это через индекс в группу:

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

Большая хитрость заключается в том, что вам нужно собирать факты для всех интересующих вас хостов / групп. Таким образом, вы захотите изменить свою игровую книгу, которая работает против группы репортеров, для включения в нее задачи no-op (dummy), которая применяется. группе коллекционеров. Это заставит Ansible собирать факты о хостах сборщиков, чтобы к ним можно было получить доступ из группы репортеров. Так что вы можете добавить что-то вроде этого в начало своего репортерского репортажа:

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]

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

Редактировать # 1

Мне пришло в голову, что я должен также упомянуть, что начиная с версии 1.8 Ansible, есть функция кэширования фактов, которая теперь доступна. Кэширование фактов использует сервер Redis для хранения фактов между запусками playbook. Если он включен, одна книга воспроизведения может ссылаться на факты, полученные другой книгой, которая была запущена ранее. Пример документации Ansible дает:

Представьте, например, очень большую инфраструктуру с тысячами хостов. Кэширование фактов может быть настроено на ночное выполнение, но конфигурация небольшого набора серверов может выполняться в режиме ad-hoc или периодически в течение дня. Если включено кэширование фактов, нет необходимости «обращаться» ко всем серверам, чтобы ссылаться на переменные и информацию о них.


2
Есть ли способ установить ассоциативный индекс в качестве переменной? в примере ansible localhost --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}}"
corretge

Чтобы добавить ответ, приведенный выше, убедитесь, что вы ссылаетесь на Ansible FAQ здесь: docs.ansible.com/ansible/faq.html, который подробно объясняет такие вещи, как зацикливание группы хостов или установка переменной для получения конкретного хоста. в группе.
Эйнарк

Спасибо за идею извлечения фактов из узла с пустым списком задач.
Pedz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.