如何使jinja2发电机在ansible中工作?

如何使jinja2发电机在ansible中工作?,ansible,jinja2,Ansible,Jinja2,我有一个嵌套dict的列表。我想使用jinja2生成器来创建一个列表 test_nested_dict_list: - foo: a: x: 1 y: 2 b: 2 - bar: a: x: 2 y: 4 b: 4 - debug: msg: "{{(u.b for u in test_nested_dict_list if u.a.x == 1 ) | list}}" 这会导

我有一个嵌套dict的列表。我想使用jinja2生成器来创建一个列表

test_nested_dict_list:
  - foo:
    a:
      x: 1
      y: 2
    b: 2
  - bar:
    a:
      x: 2
      y: 4
    b: 4

- debug:
    msg: "{{(u.b for u in test_nested_dict_list if u.a.x == 1 ) | list}}"
这会导致一个错误:
{“msg”:“模板化字符串时模板错误:预期的标记”),得到了“for”。字符串:{{(u.b for u in test_nested_dict_list if u.a.x==1)| list}}}

,过滤器使用的JSON查询语言是一种非常强大的语言,可以帮助您实现这一目标

实际上,其中的文档与您想要实现的目标非常相似

因此,整个逻辑只依赖于查询语言查找嵌套数据以选择节点的能力。
因此,这种语法:
[?a.x==`1`].b
相当于一种逻辑,如查找所有具有
a.x==1
的子元素,然后从中获取
b

根据剧本:

-hosts:localhost
收集事实:不
变量:
测试嵌套目录列表:
-傅:
a:
x:1
y:2
b:2
-酒吧:
a:
x:2
y:4
b:4
任务:
-调试:
msg:{{test_nested_dict_list}json_查询('[?a.x==`1`].b')| list}
它提供了概述:

PLAY [localhost] *****************************************************************************************************************

TASK [debug] *********************************************************************************************************************
ok: [localhost] => {
    "msg": [
        2
    ]
}

PLAY RECAP ***********************************************************************************************************************
localhost  

Python代码可以像这样使用
shell
模块执行

-shell:|
打印(如果u['a']['x']==1,{test\u nested\u dict\u list}}中的u的列表(u['b']))
args:
可执行文件:/usr/bin/python
寄存器:结果
-调试:
msg:“{result.stdout}”

所以在这种情况下,你会期望
[2]
,对吗?@β.εηοτ.βε是的。但我真的想使用生成器理解,它更容易阅读,在某些情况下更灵活。ansible支持生成器理解吗?虽然ansible是Python,但模板语言是Jinja。从这里你甚至可以看到他们在过滤器和它所替换的相应发电机之间进行并联,这似乎是不可能的。Ansible有一个额外的过滤器列表,但我会说,运气不好。当然,你可以让节点来完成这项工作,而不仅仅是控制器,我可能忘记了在我的评论框中进行思考。