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"
    }