Ansible需要创建一个替换变量的json列表

时间:2016-05-06 00:43:16

标签: json ansible jinja2

我有这个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 %}

我怎么能申请呢?

谢谢!

2 个答案:

答案 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

希望有所帮助,如果您希望我对某些事情更具体,请告诉我。