为ansible模板创建数据结构

时间:2014-11-12 03:56:03

标签: jinja2 ansible

我试图创建一个简单的配置文件,它枚举所有(hostname,ip_address)对作为ansible任务的一部分。我真正喜欢做的是这样的事情(使用ansible的全球数据结构groupshostvars):

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()函数?

1 个答案:

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

}

gdelimhdelim用于在需要时设置分隔符(请注意对象前缀的分隔符)。

首次运行时,分隔符为空,然后是","。由于对象以分隔符为前缀,因此您没有尾随逗号,因此生成的JSON有效(但有点难看)。