让我们想象一个像这样的清单文件:
node-01 ansible_ssh_host=192.168.100.101
node-02 ansible_ssh_host=192.168.100.102
node-03 ansible_ssh_host=192.168.100.103
node-04 ansible_ssh_host=192.168.100.104
node-05 ansible_ssh_host=192.168.100.105
[mainnodes]
node-[01:04]
在我的playbook中,我现在想创建一些包含组mainnodes
的IP地址的变量:
vars:
main_nodes_ips: "192.168.100.101,192.168.100.102,192.168.100.103,192.168.100.104"
main_nodes_ips_with_port: "192.168.100.101:3000,192.168.100.102:3000,192.168.100.103:3000,192.168.100.104:3000"
这是我目前为止得到的:
vars:
main_nodes_ips: "{{groups['mainnodes']|join(',')}}"
main_nodes_ips_with_port: "{{groups['mainnodes']|join(':3000,')}}"
但那将使用主机名而不是IP地址。
有任何想法如何实现吗?
更新:
看了一段时间的文档,我认为这将允许我循环遍历所有IP地址:
{% for host in groups['mainnodes'] %}
{{hostvars[host]['ansible_ssh_host']}}
{% endfor %}
但我现在还不能想出如何创建一个包含所有这些IP的数组。这样我就可以在它们上使用|join()
命令。
更新2:
我刚才以为我已经想出来了……但事实证明你不能在playbook中使用{% %}语法……或者我可以吗?
嗯,在vars部分不行。 :/
vars:
{% set main_nodes_ip_arr=[] %}
{% for host in groups['mesos-slave'] %}
{% if main_nodes_ip_arr.insert(loop.index,hostvars[host]['ansible_ssh_host']) %} {% endif %}
{% endfor %}
main_nodes_ips: "{{main_nodes_ip_arr|join(',')}}"
main_nodes_ips_with_port: "{{main_nodes_ip_arr|join(':3000,')}}"
ansible_ssh_host
已被弃用。此解决方案仍然有效,但您需要将其替换为ansible_host
。 - Pudding