给出这些字典:
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 }}
成功映射了键,但是在过程中丢失了值...
答案 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 }}"