Ansible hash to json to jinja template

时间:2019-02-21 08:26:30

标签: json dictionary templates hash ansible

我得到了以下答案,并因得到正确的答案而陷入困境。我有一个命令,我想用文件名中的item.key和模板中的所有值进行模板化。

my_dict:
  name1:
    { path=/x/y/z, action=all, filter=no },
    { path=/a/b/c, action=some, filter=yes }
  name2:
    { path=/z/y/x, action=nothing, filter=no },
    { path=/c/b/a, action=all, filter=yes }

 tasks:
   - name: generate check config
     template:
       src: check.j2
       dest: "{{ config_dir }}/{{ item.key }}-directories.json"
       owner: Own
       group: Wheel
       mode: 0644
     with_dict:
       - "{{ my_dict }}"
     when:
       - my_dict is defined
     become: true

我的模板看起来像

{
"configs": [

{% for value in my_dict %}
{
"path": "{{ value.path }}",
"action": "{{ value.action }}",
{% if value.filter is defined %}
"filter": "{{ value.filter }}"
{% endif %}
}{% if !loop.last %},{% endif %}
{% endfor %}
]
}

所以我进行了如此多的测试,以至于现在我看不到有太多树木引起的森林问题。

以上应产生2个文件。 文件名= name1-directories.json 内容:

{
"configs": [
{
"path": /x/y/z,
"action": all,
"filter": no
},
{
"path": /a/b/c,
"action": some,
"filter": yes
}
]
}

预先感谢

1 个答案:

答案 0 :(得分:0)

让我从以下内容开始。我发现您当前的解决方案存在一些问题。

  1. 您是模板,当应该改为读取value.<key>时,会使用item.value.<key>引用数组项的值。
  2. with_dict需要一个dict,但是您要传递一个包含dict作为唯一元素的数组。在yaml中,-表示数组元素。要正确使用它,您只需编写:with_dict: "{{ my_dict }}"
  3. 不建议使用简写yaml语法,因为这会使剧本难以阅读。

我建议您执行以下操作:

有一个jinja2过滤器,可以将您的字典转换为json:

{{ dict_variable | to_json }} # or
{{ dict_variable | to_nice_json }}

第二个使人类可读。您当前正在尝试做的事情可能会起作用(尚未对其进行全面研究),但它并不美观且容易出错。

要使其与jinja2过滤器一起使用,请按以下方式在顶部重组变量:

    my_dict:
      - name1:
          configs:
            - path: /x/y/z
              action: all
              filter: no
            - path: /a/b/c
              action: some
              filter: yes
      - name2:
          configs:...

当var格式如下时,您可以使用copy模块将配置打印到以下文件中:

    - name: Print the configs to the files
      copy:
        content: "{{ item.value | to_nice_json }}"
        dest: "{{ config_dir }}/{{ item.key }}-directories.json"
      with_dict: "{{ my_dict }}"