我有一个模板文件config.j2
。
{% for host in groups['dbs'] %}
ips= {{ hostvars[host].ansible_default_ipv4.address }}
{% endfor %}
我的输出是:
ips= 192.168.231.91
ips= 192.168.231.92
ips= 192.168.231.93
我想将输出保存在数组变量中,如下所示:
ips=192.168.231.91,192.168.231.92,192.168.231.93
怎么能做到这一点呢?谢谢。
找到解决方案后编辑并输出:
- set_fact:
ips: []
run_once: true
- set_fact:
ips: "{{ips}} + ['{{hostvars[item].ansible_default_ipv4.address}}']"
with_inventory_hostnames:
- dbs
run_once: true
- name: Save ip servers
template: src=conf.j2 dest=/root
TASK [Gathering Facts] *************************************************************************************************************************
ok: [db1]
ok: [db2]
ok: [db3]
TASK [get-var : set_fact] **********************************************************************************************************************
ok: [db1]
TASK [get-var : set_fact] **********************************************************************************************************************
ok: [db1] => (item=db1)
ok: [db1] => (item=db3)
ok: [db1] => (item=db2)
TASK [get-var : Save ip servers] ***************************************************************************************************************
ok: [db1]
ok: [db2]
ok: [db3]
PLAY RECAP *************************************************************************************************************************************
db1 : ok=4 changed=0 unreachable=0 failed=0
db2 : ok=2 changed=0 unreachable=0 failed=0
db3 : ok=2 changed=0 unreachable=0 failed=0
最后在主机(db)上的模板中输出:
[root@db1 ~]# cat conf.j2
ips=[]
[root@db1 ~]#
答案1
剧本中的一种解决方案是初始化一个空列表,然后附加到它循环清单组中的主机名:
- set_fact:
ips: []
run_once: true
- set_fact:
ips: "{{ips}} + ['{{hostvars[item].ansible_default_ipv4.address}}']"
with_inventory_hostnames:
- dbs
run_once: true
- template:
src: config.j2
dest: /tmp/whatever
config.j2
包含一个模板文件
ips={{ ips|to_yaml }}
答案2
这是我如何让它工作的
- set_fact:
ips="[]"
run_once: true
- set_fact:
ips="{{ ips }} + ['{{ hostvars[item].ansible_default_ipv4.address }}']"
with_inventory_hostnames:
- dbs
run_once: true
- name: get ip list locally
local_action: copy content="{{ ips }}" dest=files/nodes
run_once: true
文件/节点
["192.168.1.13", "192.168.1.8", "192.168.1.14", "192.168.1.6", "192.168.1.9"]
答案3
如果您对库存中的每个主机使用变量 ansible_host 您可以这样做:
- set_fact: nodelist={%for host in groups['dbs']%}{{hostvars[host].ansible_host}}{%
if not loop.last %},{% endif %}{% endfor %}
或者根据您的条件:
- set_fact: nodelist={%for host in groups['dbs']%}
{{ hostvars[host].ansible_default_ipv4.address }}{% if not loop.last %},{% endif %}{%
endfor %}
注意:代码应该在一行中。