Ansible中根据条件移除字典列表中b值为null的元素
解决Ansible字典列表过滤问题
你的代码存在两个核心问题:
- 使用
loop遍历单个字典再逐个处理的方式错误,reject过滤器是用于列表级别的过滤,而非单个字典; - 每次
set_fact会覆盖dict2的值,最终无法得到完整的过滤后列表。
正确的做法是直接对字典列表使用rejectattr过滤器,一次性过滤掉所有b值为"null"的字典项:
- hosts: localhost gather_facts: false vars: dict1: [{a:1,b:2,c:3},{a:1,b:"null",c:3},{a:1,b:2,c:3}] tasks: - set_fact: dict2: "{{ dict1 | rejectattr('b', 'eq', 'null') | list }}" - debug: var: dict2
代码说明:
rejectattr('b', 'eq', 'null'):指定过滤条件,排除所有b属性值等于字符串"null"的字典项| list:将过滤后的迭代器转换为列表(Ansible中部分过滤器返回迭代器,转成列表便于后续使用)
执行后输出的dict2将符合你的期望:
dict2: [{a:1,b:2,c:3},{a:1,b:2,c:3}]
如果你的场景中b的值是真正的空值(Ansible中的None,而非字符串"null"),只需将条件改为rejectattr('b', 'none')即可。
内容的提问来源于stack exchange,提问作者LJS
相关产品推荐
相关产品推荐

