【发布时间】:2016-03-31 09:07:43
【问题描述】:
让我们想象一个这样的库存文件:
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]
在我的剧本中,我现在想创建一些变量,其中包含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:
我只是以为我已经弄明白了......但事实证明你不能在剧本中使用 {% %} 语法......或者我可以吗?
那么在 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,')}}"
【问题讨论】:
-
对于使用 2.0+ 版本的任何人,
ansible_ssh_host已被弃用。此解决方案仍然有效,但您需要将其替换为ansible_host -
您写道,您对自己的分析器不太满意。你已经非常接近最佳实践了。请现在将 McKelvins 设置为接受的。 stackoverflow.com/a/39932728/2898712 谢谢。
标签: ansible jinja2 ansible-playbook