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

передача списка списков в playbook одной команде (не with_items)

У меня две группы хостов: 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. Вы должны проверить, что работает для вас.