从一组服务器获取地址列表(ansible_主机)

从一组服务器获取地址列表(ansible_主机),ansible,Ansible,我有一份采用以下格式的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主机,为此,我一直使用: i

我有一份采用以下格式的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主机,为此,我一直使用:

ips = "{{ query('inventory_hostnames', 'sites') | map('ipaddr') | join(',') }}"
但是我现在在这个清单中遇到的问题是,
query('inventory\u hostnames')
不返回
s3
的IP,而是返回一个字符串
jail\u 3
列表的输出如下:

'10.10.0.80'
'10.10.1.80'
'jail_s3'
我发现我可以使用
循环
对输出进行如下过滤:

debug:
  msg: "{{ item if (item| ipaddr) else  hostvars[item].ansible_host }}"
loop: "{{ query('inventory_hostnames','servers') }}"
或在循环中的模板中:

{% for host in query('inventory_hostnames', 'servers') %}
{{ hostvars[host].ansible_host|default(hostvars[host].inventory_hostname) }}
{% endfor %}
在这种情况下,过滤器
ipaddr
jail\u s3
返回false,然后返回到
hostvars[item].ansible\u host

这是可行的,但我想知道它是否可以在“一行”中完成,可能是通过使用
映射
,或者使用
查询列表('inventory_hostnames','servers')?

有什么想法吗