如何映射键,在另一个字典中查找键?

时间:2020-10-14 01:52:26

标签: ansible jinja2

给出这些字典:

somedict:
  key1: value1
  key2: value2
otherdict:
  key1: mapped1
  key2: mapped2

如何在Ansible的somedict中查找otherdict并更改其键?结果应该是这样:

mapped1: value1
mapped2: value2

似乎可以用这样的声明来实现:

{{ somedict | map(<MAP KEY>) | list }}

还是我真的必须对这种事情使用命令式循环?

以下

{{ somedict | map('extract', otherdict) | list }}

成功映射了键,但是在过程中丢失了值...

1 个答案:

答案 0 :(得分:1)

Q:“ 结果应为:

mapped1: value1
mapped2: value2

A:下面的任务

    - debug:
        msg: "{{ somedict|
                 map('extract', otherdict)|
                 zip(somedict|
                     dict2items|
                     map(attribute='value'))|
                 list }}"

给出一个列表列表。这不是预期的结果

  msg:
  - - mapped1
    - value1
  - - mapped2
    - value2

要接收字典,请应用 dict 函数并删除 list 过滤器。例如

    - debug:
        msg: "{{ dict(somedict|
                      map('extract', otherdict)|
                      zip(somedict|
                          dict2items|
                          map(attribute='value'))) }}"

给予

  msg:
    mapped1: value1
    mapped2: value2

这可以进一步简化。下面的任务给出了相同的词典

    - debug:
        msg: "{{ dict(somedict|
                      map('extract', otherdict)|
                      zip(somedict.values())) }}"

笔记
  • 将字典转换为列表会在字典键列表中产生结果。例如
    - debug:
        msg: "{{ somedict|list }}"

给予

  msg:
  - key1
  - key2
  • 通过列出字典键可以达到相同的结果
    - debug:
        msg: "{{ somedict.keys()|list }}"