如何使用Ansible Jinja2 reject过滤器排除info列表中的xyz键?
移除Ansible中info列表字典里的xyz键
你需要移除info列表中字典的顶层xyz键,以及嵌套在abc里的xyz键,之前用reject('equalto','xyz')或reject('match', '[xyz]')无效,是因为这两个过滤器是过滤列表元素,而非操作字典的键。
方案1:移除顶层xyz键(动态保留其他键)
用dict2items把字典转成键值对列表,过滤掉key为xyz的项,再转回字典:
- set_fact: info: "{{ info | map('dict2items') | map('rejectattr', 'key', 'equalto', 'xyz') | map('items2dict') | list }}"
- 逻辑:遍历info列表的每个字典,将字典拆分为键值对数组,剔除键为
xyz的条目,再重新组合成字典,最后转回列表。
方案2:同时移除顶层和嵌套的xyz键
如果需要同时移除abc字典里的xyz键,可以用循环手动处理嵌套结构:
- set_fact: info: >- {% set updated_list = [] %} {% for item in info %} # 清理abc中的xyz键 {% set cleaned_abc = item.abc | dict2items | rejectattr('key', 'equalto', 'xyz') | items2dict %} # 清理顶层xyz键并替换处理后的abc {% set cleaned_item = item | combine({'abc': cleaned_abc}) | dict2items | rejectattr('key', 'equalto', 'xyz') | items2dict %} {% do updated_list.append(cleaned_item) %} {% endfor %} {{ updated_list }}
方案3:用json_query指定保留的键(适合键固定的场景)
如果info里的键是固定的,可以直接用json_query选择需要保留的键,间接排除xyz:
- set_fact: info: "{{ info | json_query('[].{effect: effect, name: name, abc: {name: abc.name}}') }}"
- 逻辑:明确指定每个字典要保留的键和嵌套结构,自动排除未提及的
xyz。
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

