У меня есть 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') | ???
Есть идеи?