我是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
文件的字典中打印所有内容。
提前谢谢
答案 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
如果您需要特定格式的内容,请告诉我所需的输出内容