如何使用 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]