我有一个项目列表,它们在某个字典中都以键的形式出现。我想使用Jinja2过滤器来查找字典中的每个列表项,并返回相应的值,在一个列表中。
在python中应该是:
[my_dict[x] for x in my_list]
Jinja对应的是什么?
my_list | map(my_dict)
不工作
这是一个剧本样本。
---
- hosts: localhost
connection: local
vars:
my_dict:
a: 1
b: 2
c: 3
my_list:
- a
- c
tasks:
- assert:
that:
- "{{ actual == expected }}"
vars:
# [my_dict[x] for x in my_list]
actual: "{{ my_list | map(my_dict) | list }}"
expected:
- 1
- 3
如果你运行这个,你得到:
fatal: [localhost]: FAILED!=比;{"msg": "模板化"{{my_list | map(my_dict) | list}}"时发生未处理的异常。错误是一个<类'ValueError'>,原始消息:键必须是字符串"}
我想修改actual:
行,使这个剧本没有错误。
注意,我不想在Ansible本身循环。这是一个简单的MWE。在我的实际示例中,这个查找应该内联在一个更大的模板文件中。
给定列表
my_list: [a, c]
使用过滤器提取物
actual: "{{ my_list|map('extract', my_dict)|list }}"
应该给
actual: [1, 3]
当列表中的某些项在字典中缺失时,上述解决方案不起作用。例如,
my_list: [a, c, x]
将会失败
" dict对象"没有属性"x">
在本例中,选择列表中的键。下面的表达式给出了相同的结果
actual: "{{ my_dict|dict2items|
selectattr('key', 'in', my_list)|
map(attribute='value')|list }}"
测试
的完整剧本示例- hosts: localhost
vars:
my_list: [a, c]
my_dict:
a: 1
b: 2
c: 3
actual1: "{{ my_list|map('extract', my_dict)|list }}"
actual2: "{{ my_dict|dict2items|
selectattr('key', 'in', my_list)|
map(attribute='value')|list }}"
tasks:
- debug:
var: actual1|to_yaml
- debug:
var: actual2|to_yaml