jinja2-遍历字典

时间:2019-03-04 07:55:59

标签: 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文件中,我想循环浏览此字典并打印字典中定义的所有内容。

我尝试了各种示例,但没有正确的方法。

例如:

{% for item in test123.values() -%}
{{ item.name }}="{{ item.number }}"
{%- endfor %} 
{% for item in test123.testB.values() -%}
    {{ item.name }}="{{ item.number }}"
{%- endfor %} 

错误消息:

  致命:[测试服务器]:失败! => {“已更改”:false,“ msg”:   “ AnsibleUndefinedVariable:   'ansible.parsing.yaml.objects.AnsibleUnicode对象'没有属性   '名称'“}

我认为最好的办法是为此创建一个while循环并打印出所有内容,但是由于在Jinja2中没有while循环,我对如何执行此操作有些困惑。

有人知道如何实现吗?因此,我们的目标再次是从Jinja2文件的字典中打印所有内容。

提前谢谢

3 个答案:

答案 0 :(得分:0)

这不是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 %}

当然,您需要将此字典传递给渲染函数(不发布控制器代码)。不知道这是否适用于ansible。

答案 1 :(得分:0)

一种选择是使用dict2items过滤器。下面的模板

{% 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 %}

给予

{'value': {u'path': u'/tmp/test.txt', u'name': u'test1', u'number': 1}, 'key': u'testA'}
{'value': {u'path': u'/tmp/test.txt', u'name': u'test2', u'number': 2}, 'key': u'testB'}

key: testA
value.number: 1
value.name: test1
value.path: /tmp/test.txt

key: testB
value.number: 2
value.name: test2
value.path: /tmp/test.txt

答案 2 :(得分:0)

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

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

输出格式:

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

如果您需要特定格式的内容,请告诉我所需的输出内容