首页 > 解决方案 > 从一组服务器获取地址列表(ansible_host)

问题描述

我有一个具有这种格式的 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

我想得到属于 group 的所有ansible主机的逗号分隔servers,为此,我一直在使用:

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

但是我现在对这个清单的问题是query('inventory_hostnames')不返回 IPs3而是返回一个字符串jail_3,列表的输出如下:

'10.10.0.80'
'10.10.1.80'
'jail_s3'

我发现我可以使用 aloop并过滤如下输出:

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返回 false jail_s3,然后我回退到hostvars[item].ansible_host.

这行得通,但我想知道它是否可以通过使用“单线”来完成map,或者可以使用列表的东西query('inventory_hostnames','servers') | ???

有任何想法吗?

标签: ansible

解决方案


推荐阅读