如何使用 Jinja 过滤器将字典应用于项目列表?
How to apply dictionary to list of items with Jinja filter?
我有一个项目列表,它们都显示为某个字典中的键。
我想使用 Jinja2 过滤器在字典中查找每个列表项,并在列表中 return 相应的值。
在 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": "An unhandled exception occurred while templating '{{ my_list | map(my_dict) | list }}'. Error was a <class 'ValueError'>, original message: key must be a string"}
我想修改 actual:
行以使该剧本 运行 没有错误。
请注意,我不想在 Ansible 本身中循环。这是一个简单的 MWE。在我的真实示例中,此查找应该内嵌在一个更大的模板文件中。
使用过滤器extract
actual: "{{ my_list|map('extract', my_dict)|list }}"
应该给
actual: [1, 3]
我有一个项目列表,它们都显示为某个字典中的键。 我想使用 Jinja2 过滤器在字典中查找每个列表项,并在列表中 return 相应的值。
在 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": "An unhandled exception occurred while templating '{{ my_list | map(my_dict) | list }}'. Error was a <class 'ValueError'>, original message: key must be a string"}
我想修改 actual:
行以使该剧本 运行 没有错误。
请注意,我不想在 Ansible 本身中循环。这是一个简单的 MWE。在我的真实示例中,此查找应该内嵌在一个更大的模板文件中。
使用过滤器extract
actual: "{{ my_list|map('extract', my_dict)|list }}"
应该给
actual: [1, 3]