Python jinja2-循环浏览字典

Python jinja2-循环浏览字典,python,ansible,jinja2,Python,Ansible,Jinja2,我是新来的Jinja2也许我的问题是noobie,但我不明白 因此,我将Jinja2用于Ansible任务,作为创建文件的模板,我在默认变量文件中定义了一个字典,如: test123: testA: name: test1 number: 1 path: /tmp/test.txt testB: name: test2 number: 2 path: /tmp/test.txt 现在,在我的Jinja2文件中,我想循环浏览这本词典并打印词

我是新来的
Jinja2
也许我的问题是noobie,但我不明白

因此,我将
Jinja2
用于
Ansible
任务,作为创建文件的模板,我在默认变量文件中定义了一个字典,如:

test123:
  testA:
    name: test1
    number: 1
    path: /tmp/test.txt
  testB:
    name: test2
    number: 2
    path: /tmp/test.txt
现在,在我的
Jinja2
文件中,我想循环浏览这本词典并打印词典中定义的所有内容

我试过各种各样的例子,但没有一个是正确的

例如:

{% for item in test123.values() -%}
{{ item.name }}="{{ item.number }}"
{%- endfor %} 
{% for item in test123.testB.values() -%}
    {{ item.name }}="{{ item.number }}"
{%- endfor %} 
错误消息:

致命:[testserver]:失败!=>{“已更改”:false,“msg”: “Ansibleundfinedvariable: “ansible.parsing.yaml.objects.AnsibleUnicode对象”没有属性 “名称”}

我想最好的办法可能是为此创建一个while循环,并将所有内容打印出来,但由于在
Jinja2
中没有while循环,因此我有点不知道如何做

有人知道如何做到这一点吗?因此,我们的目标再次是在
Jinja2
文件中打印字典中的所有内容


提前谢谢你

这不是python字典。但是,如果您有一个目录列表:

test123 = [
    {'name':'test1', 'number': 1, 'path': '/tmp/test.txt'},
    {'name':'test2', 'number': 2, 'path': '/tmp/test.txt'},
    ]
此jinja代码应适用于:

{% for item in test123 %}
    {{ item.name }}="{{ item.number }}"
{% endfor %}
当然,您需要将此dict传递给渲染函数(您不需要发布控制器代码)。不知道这是否适用于ansible。

一个选项是使用过滤器。下面的模板

{% for item in test123|dict2items %}                                                
{{ item }}                                                                          
{% endfor %}

{% for item in test123|dict2items %}
key: {{ item.key }}
value.number: {{ item.value.number }}
value.name: {{ item.value.name }}
value.path: {{ item.value.path }}

{% endfor %}
给予


下面将创建一个包含所有用户名的输出

{% for item in test123.values() %}
name of the user: {{ item.name }}
{% endfor %}
输出格式:

name of the user: test1
name of the user: test2

如果您需要特定格式的内容,请让我知道所需的输出

不是Python字典。不确定Ansible。目标主机上的Python版本是什么?@amanb我使用本手册在Ansible中创建字典:(在顶部的示例中,您可以看到示例)那么jinja2不能使用该字典吗?@ozlevka目标主机上的python版本是:python 2.7.5Hi,感谢您的回复。我对它进行了测试,得到了您在示例中编写的值,但我现在需要在特定区域中添加一个特定值,例如:``用户名:key.testA.name```所以我会这样做:```{%for item in test123 | dict2items%}用户名:{{test123.testA[name].item}{%endfor%}``但这不起作用,所以我认为语法是错误的,对吗?提前谢谢。请参阅更新的答案。如果您有问题,请关注并编辑您的问题。您好,谢谢您的回复,不幸的是,至少在ansible中,这并不像预期的那样有效。。。我尝试了类似这样的“test_dict:[{'name':'test1','number':'1','path':'/tmp/test.txt'}]`并让它工作起来,但这并不是我真正想要的解决方案,因为我想要有几个带有其他值的“键”,并在模板文件中的特定位置使用它,如果你明白我的意思的话:)我想你正在寻找一个dict列表。我按预期编辑了我的答案:)因此.values()调用dict中的所有值,对吗?是的。然后可以使用item.name访问子元素,{{}用于jinja2中的变量替换
name of the user: test1
name of the user: test2