Ansible jinja2在使用from_json时将列表转换为字符串
我正在尝试运行嵌套的Ansible jinja2在使用from_json时将列表转换为字符串,ansible,jinja2,Ansible,Jinja2,我正在尝试运行嵌套的for循环以检索嵌套值。 当some_value_3与预定义的条件匹配时,我想检索some_value_4 { "some_dict": { "some_key_0": "value_0", "some_key_1": "value_1" }, "testval_dict": { "test_key_0"
for
循环以检索嵌套值。
当some_value_3
与预定义的条件匹配时,我想检索some_value_4
{
"some_dict": {
"some_key_0": "value_0",
"some_key_1": "value_1"
},
"testval_dict": {
"test_key_0": "some_value_0",
"test_key_1": "some_value_1",
"test_key_2": "some_value_2",
"test_key_3": "some_value_3",
"test_key_4": "some_value_4"
}
}
剧本:
- hosts: localhost
tasks:
- set_fact:
mydict: "{{ lookup('file', '/tmp/file.json' ) | from_json }}"
- debug:
msg: |
"{% for item in mydict %}
{{ item }}
{% endfor %}"
在运行时,dict名称似乎一直被视为字符串,仅此而已:
ansible-playbook /tmp/test_playbook.yml -c local -i ', localhost'
TASK [debug] ******************************************************************
ok: [localhost] => {}
MSG:
" somee_dict
testval_dict
"
然后,当我将itme.key
添加到debug
任务时,playbook失败:
MSG:
The task includes an option with an undefined variable. The error was: 'str object' has no attribute 'value'
多谢各位
编辑以进行澄清
在实际示例中,我不知道dict的名称,因此我不能使用
某些dict
或testval\u dict
,这就是为什么我试图在项.key
或项.value
表单中检查此数据源。如果需要循环字典,可以使用和
循环功能。这样,如果您循环使用mydict
并获得item.key
,您将获得somee\u dict
和testval\u dict
任务:
-设定事实:
mydict:{{lookup('file','/tmp/file.json')| from_json}
#这将得到顶级字典somee_dict和testval_dict
-调试:
var:item.key
带_dict:{{mydict}}”
如果您获得mydict
的item.value
,您将获得子字典:
-调试:
变量:项目价值
带_dict:{{mydict}}”
将产生(仅显示测试值的输出):
Q:“{%for mydict%}中的项…dict名称被视为字符串,仅此而已。”
答:这是正确的。字典作为列表计算时,返回其键的列表。见下面的一些例子
-调试:
msg:{{mydict.keys()| list}}
-调试:
msg:{{mydict[item]}
循环:{{mydict.keys()| list}}
-调试:
msg:{mydict|difference(['testval_dict'])}”
给予
msg:
-有人说
-测试值
msg:
一些键:值
一些密钥:值
味精:
测试键:某些值
测试\u键\u 1:一些\u值\u 1
测试键2:一些值2
测试键3:一些值3
测试键4:一些值4
msg:
-有人说
见谢谢。是的,我没有条件,因为我甚至没有成功地进入下一级,所以我把问题保持简单我可以用你的例子做到这一点。我不能用
{{item.key}}
或{{item.value}}
的形式来处理这个问题,我是否注定要在这里失败,jinja2将继续只获取字符串?重新添加我以前的注释。您应该能够通过mydict.testval\u dict.test\u key\u X
访问testval\u dict
的值,而无需循环。我非常愚蠢地编辑了另一个用户留下的注释:(,建议使用mydict.testval_dict
,以便在dict中进一步提高一个级别。很抱歉@seshadri_c,我显然还没有足够的咖啡。@seshadri_c,我想我必须在这里循环,因为我不知道这两个dict的名称,所以我必须忽略它们并在其中进行迭代,这有意义吗?correct,我已经试过了,它让我使用了和_dict.testval _dict
,然后我又想知道dict的名字。也许这是无法逃避的,我正在尝试无法做到的事情。是的,这似乎是真的。因为在不知道键的情况下访问字典中的值,即使没有嵌套也是相当困难的。
"item.value": {
"test_key_0": "some_value_0",
"test_key_1": "some_value_1",
"test_key_2": "some_value_2",
"test_key_3": "some_value_3",
"test_key_4": "some_value_4"
}