Представьте себе такой файл инвентаризации:
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]
В моей книге я теперь хочу создать некоторые переменные, содержащие 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"
Это то, что я получил до сих пор:
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()
.
Update2:
Я просто подумал, что я это понял... но оказывается, что вы не можете использовать синтаксис {%%} в плейбуке... или я могу? Ну, в секции варов это не так. :/
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,')}}"