让我们假设一个像这样的库存文件:
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]
Run Code Online (Sandbox Code Playgroud)
在我的剧本中,我现在想要创建一些包含该组IP地址的变量mainnodes:
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"
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所得到的:
vars:
main_nodes_ips: "{{groups['mainnodes']|join(',')}}"
main_nodes_ips_with_port: "{{groups['mainnodes']|join(':3000,')}}"
Run Code Online (Sandbox Code Playgroud)
但那会使用主机名而不是IP地址.
有什么想法可以做到这一点?
更新:
看了一段时间的文档,我认为这将允许我遍历所有的IP地址:
{% for host in groups['mainnodes'] %}
{{hostvars[host]['ansible_ssh_host']}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何创建一个包含所有这些IP的数组.这样我就可以|join()对它们使用命令了.
Update2:
我只是觉得我已经弄明白了......但事实证明你不能在剧本中使用{%%}语法......或者我可以吗?在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,')}}"
Run Code Online (Sandbox Code Playgroud)