我试图创建一个简单的配置文件,它枚举所有(hostname,ip_address)对作为ansible任务的一部分。我真正喜欢做的是这样的事情(使用ansible的全球数据结构groups
和hostvars
):
def grouped_hosts():
ret = {}
for group in groups:
ret[group] = {}
for host in groups[group]:
ret[group][host] = hostvars[host]['ansible_eth0']['ipv4']['address']
return json.dumps(ret)
哪个会发出类似于的数据结构:
{"webservers":{"web0":"1.2.3.4","web1":"1.2.3.5"},{"caches":{"cache0":"1.2.3.6"}}}
但是,我不知道如何构建这个数据结构并将其传递给我的jinja2模板。我真的希望能够创建该数据结构,只需将{{ grouped_hosts()|to_nice_json }}
称为一天即可。但是,我如何编写,以及我在哪里放置grouped_hosts()
函数?
答案 0 :(得分:0)
我不确定您尝试使用模板创建的内容,但如果您只想将其输出为json结构,则可以这样做:
{
{% set gdelim = '' %}
{% for group in groups %}
{{ gdelim }}"{{group}}": {
{% set hdelim = '' %}
{% for host in groups[group] %}
{{ hdelim }}"{{ host }}": "{{hostvars[host]['ansible_eth0']['ipv4']['address']}}"
{% set hdelim = ',' %}
{% endfor %}
}
{% set gdelim = ',' %}
{% endfor %}
}
gdelim
和hdelim
用于在需要时设置分隔符(请注意对象前缀的分隔符)。
首次运行时,分隔符为空,然后是","
。由于对象以分隔符为前缀,因此您没有尾随逗号,因此生成的JSON有效(但有点难看)。