我得到了以下内容,并得到了正确的答案。我有一个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提前
让我从以下开始。我发现您当前的解决方案存在一些问题。
value.<key>
模板引用数组项的值,而不应该读取item.value.<key>
。with_dict
期待一个dict,但是你传递的是一个包含dict作为唯一元素的数组。在yaml中,-
表示阵列元素。要正确使用它,你只需写:with_dict: "{{ my_dict }}"
我建议你做以下事情:
有一个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 }}"