我有这个json文件:
}
"retry_join": ["192.168.100.11","192.168.100.12","192.168.100.14"],
"server": true,
"data_dir": "/var/lib/consul",
"log_level": "INFO",
"enable_syslog": false,
"datacenter": "Morrisville",
"rejoin_after_leave": true,
"client_addr": "0.0.0.0",
"bind_addr": "{{ ansible_host }}",
"advertise_addr": "{{ ansible_host }}"
}
我需要在这里用来自顶级标题(mville)的ansible清单文件中的不确定数量的主机替换此行:
[mville]
swarm000 ansible_host=192.168.100.11
swarm001 ansible_host=192.168.100.12
swarm002 ansible_host=192.168.100.14
[000servers]
swarm000 ansible_host=192.168.100.11
[001servers]
swarm001 ansible_host=192.168.100.12
[002-00xservers]
swarm002 ansible_host=192.168.100.14
这一行在这里:
"retry_join": ["192.168.100.11","192.168.100.12","192.168.100.14"],
需要由ansible填写,但我不知道他们可以有多少主机,因此需要在正确的位置使用逗号。
我知道如何在ansible中执行这样的for循环:
{% for host in groups['000servers'] %}
*.info;mail.none;authpriv.none;cron.none @{{ hostvars[host]['ansible_host'] }}
{% endfor %}
我怎么能申请呢?
谢谢!
答案 0 :(得分:4)
看看filters available in Ansible。特别是to_json
过滤器
{{ some_variable | to_json }}
或join
过滤器
{{ list | join(" ") }}
应该能够帮助您正确地模拟这些值。
答案 1 :(得分:3)
建立领事时我遇到了同样的问题。有一点(有点偏离主题,但值得分享)我建议你:构建小模板,假设你有1个模板用于领事服务器,1个用于连接列表。它会让你的生活更轻松,而且更灵活。 Consul将按字母顺序包含文件。
在这里回答你的问题是我的所作所为:
// Join local DC agents
{
"start_join": [ {%for host in groups.dc1 %} {% if hostvars[host]['inventory_hostname'] != inventory_hostname %} "{{hostvars[host]['inventory_hostname']}}" {% if not loop.last %}, {%endif%}{%endif%}{%endfor%}]
}
注意,我使用了主机名,但您只需使用inventory_hostname
更改ansible_host
希望有所帮助,如果您希望我对某些事情更具体,请告诉我。