получить список адресов (ansible_host) из группы серверов - PullRequest
1 голос
/ 06 апреля 2020

У меня есть ansible инвентарь в этом формате:

[servers:children]
s1
s2
s3

[s1]
10.10.0.80 hostname=s1.example.com

[s2]
10.10.1.80 hostname=s2.example.com

[s3]
jail_s3 ansible_host=10.10.2.80 ansible_port=2222 hostname=s3.example.com

Я хотел бы получить запятую всех ansible хостов, принадлежащих группе servers, для этого, Я использовал:

ips = "{{ query('inventory_hostnames', 'sites') | map('ipaddr') | join(',') }}"

Но проблема, с которой я сталкиваюсь сейчас с этим инвентарем, заключается в том, что query('inventory_hostnames') не возвращает IP для s3, вместо этого возвращает строку jail_3 вывод списка это как:

'10.10.0.80'
'10.10.1.80'
'jail_s3'

Я обнаружил, что могу использовать loop и отфильтровать вывод примерно так:

debug:
  msg: "{{ item if (item| ipaddr) else  hostvars[item].ansible_host }}"
loop: "{{ query('inventory_hostnames','servers') }}"

Или в шаблоне внутри al oop:

{% for host in query('inventory_hostnames', 'servers') %}
{{ hostvars[host].ansible_host|default(hostvars[host].inventory_hostname) }}
{% endfor %}

В этом случае фильтр ipaddr возвращает false для jail_s3, а затем я возвращаюсь к hostvars[item].ansible_host.

Это работает, но я хотел бы знать, может ли это быть выполненным в «одной строке», вероятно, используя map, или что-то, что может занять список query('inventory_hostnames','servers') | ???

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...