У меня две группы хостов: dc1 и dc2. Также объединены в группу постоянного тока.
Мне нужно передать команде список IP-адресов хостов от внешнего контроллера домена. with_items здесь вообще не работает.
Должно получиться так:
somescript -H 10.10.10.3 -H 10.10.10.4
Итак, есть 2 пункта: 1. Получить список хостов в DC группы, за исключением хостов из основной группы. Не уверен, что это вообще возможно, поэтому грязный способ - установить переменную remote_dc (или массив). 2. Допустим, у нас есть список хостов из п.1: группы [remote_dc]. Как использовать его в качестве ключа для hostvars [key] ['ansible_eth1'] ['ipv4'] ['address'] и получить результат в виде списка?
На данный момент мне пришлось использовать очень грязный способ: я создал список remote_addresses для каждой группы DC и повторил его следующим образом:
command: somescript -H {{ remote_addresses|join(' -H ') }}
Так есть ли правильный способ реализовать п.1 и п.2 и исключить ручное создание списка IP-адресов?
В доступная документация есть этот пример:
Часто используемая идиома - это прогулка по группе в поисках всех IP-адресов в этой группе:
{% for host in groups['app_servers'] %}
{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}
Он делает примерно то, что вы хотите. Вы можете использовать это так:
- name: Execute somescript
command: >
somescript {% for host in groups['app_servers'] %}
-H {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}
Теперь вы также хотите исключить сам хост из списка IP-адресов. Вы можете сделать это, изменив {% for %}
как это:
{% for host in groups['app_servers'] if host != ansible_host %}
Вместо того ansible_host
, вам может потребоваться использовать ansible_fqdn
или ansible_nodename
. Вы должны проверить, что работает для вас.