ansible hash to json to jinja template

问题描述 投票:0回答:1

我得到了以下内容,并得到了正确的答案。我有一个dict,我想用文件名中的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
}
]
}

Thx提前

json dictionary templates hash ansible
1个回答
1
投票

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

  1. 你应该使用value.<key>模板引用数组项的值,而不应该读取item.value.<key>
  2. with_dict期待一个dict,但是你传递的是一个包含dict作为唯一元素的数组。在yaml中,-表示阵列元素。要正确使用它,你只需写:with_dict: "{{ my_dict }}"
  3. 在ansible中不鼓励使用简写yaml语法,因为它会使得剧本难以阅读。

我建议你做以下事情:

有一个jinja2过滤器只是将你的dict转换为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:...

当vars像这样格式化时,您可以使用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 }}"
© www.soinside.com 2019 - 2024. All rights reserved.