ansible - 如何使 jinja2 生成器理解在 ansible 中工作?
问题描述
我有一个嵌套字典的列表。我想使用 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": "template error while templating string: expected token ')', got 'for'. String: {{(u.b for u in test_nested_dict_list if u.a.x == 1 ) | list}}"}
解决方案
JMESPath,过滤器使用的 JSON 查询语言json_query
是一种非常强大的语言,可以帮助您实现这样的事情。
实际上,文档中的一个示例看起来非常像您想要实现的目标。
因此,整个逻辑只是基于查询语言查找嵌套数据以选择节点的能力。
所以,这个语法:[?a.x==`1`].b
相当于一个逻辑,比如find all subelement having a.x == 1
,然后让我b
摆脱它。
鉴于剧本:
- hosts: localhost
gather_facts: no
vars:
test_nested_dict_list:
- foo:
a:
x: 1
y: 2
b: 2
- bar:
a:
x: 2
y: 4
b: 4
tasks:
- debug:
msg: "{{ test_nested_dict_list | json_query('[?a.x==`1`].b') | list }}"
它给出了回顾:
PLAY [localhost] *****************************************************************************************************************
TASK [debug] *********************************************************************************************************************
ok: [localhost] => {
"msg": [
2
]
}
PLAY RECAP ***********************************************************************************************************************
localhost
推荐阅读
- python - 无法将文件导入到 python 脚本并使用命令行参数将打印语句记录到另一个文件
- performance - Informatica BDE 摄取作业运行 10 多个小时,当被终止并重新运行时,在 3 小时内完成
- c# - 如何限制只上传图片?
- vue.js - 如何访问模板内输入中的文本?
- java - 数独求解器未正确求解
- java - @Bean 和 Spring 中的 Autowired 有什么区别?
- ajax - 在 laravel 5.7.14 中使用命名空间时出现此错误
- gradle - Android Gradle 插件:将 NDK 可执行文件打包到 APK 中
- javascript - 当我使用模板文字并运行代码时,结果未定义
- python - 涉及序列的任务需要多少个 RNN 单元?