Ansible如何根据列表匹配字典键生成指定结构的新字典
方案1:修正你原有循环写法
你原来的写法存在两个问题:
- loop参数不需要把匹配列表
mylist也加入遍历序列,只需要遍历目标字典转换后的键值对列表即可 - when条件直接判断当前遍历的字典键是否属于匹配列表即可
完整的正确任务代码如下:
- name: "Create a new dict, when name(s) in the list match the key in the dict" set_fact: new_dict: "{{ new_dict | default({}) | combine({item.key: item.value}) }}" loop: "{{ my_dict | dict2items }}" when: item.key in mylist
方案2:更简洁的无循环写法
你可以直接用Jinja2过滤器链实现需求,不需要显式循环,执行效率更高:
- name: "Generate filtered dict with built-in filters" set_fact: new_dict: "{{ my_dict | dict2items | selectattr('key', 'in', mylist) | items2dict }}"
逻辑说明:
- 用
dict2items把my_dict转为[{key:xxx, value:xxx}, ...]格式的列表 - 用
selectattr筛选出key属于匹配列表mylist的条目 - 用
items2dict把筛选后的列表转回字典格式,直接得到你需要的new_dict结构
内容的提问来源于stack exchange,提问作者Kevin C
相关产品推荐
相关产品推荐

