我得到了以下答案,并因得到正确的答案而陷入困境。我有一个命令,我想用文件名中的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
}
]
}
预先感谢
答案 0 :(得分:0)
让我从以下内容开始。我发现您当前的解决方案存在一些问题。
value.<key>
时,会使用item.value.<key>
引用数组项的值。with_dict
需要一个dict,但是您要传递一个包含dict作为唯一元素的数组。在yaml中,-
表示数组元素。要正确使用它,您只需编写:with_dict: "{{ my_dict }}"
我建议您执行以下操作:
有一个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 }}"