我想从字典列表中删除一些键(嵌套级别 0),以便我可以应用
unique
过滤器并获得列表项的某种分类。如果我使用 ansible.utils.keep_keys 过滤器,我会得到不需要的结果,因为它只能递归地工作。如果某些子键与过滤器匹配,这可能会导致在嵌套级别 0 上保留不匹配的键。此外,如果涉及整数列表,例如,此过滤器的行为会很奇怪。克:
- debug:
msg: "{{ my_list | keep_keys(target=['key0', 'key1']) | unique }}"
vars:
my_list:
- key0: A
key1: B
key2:
- 1
key3: foo
- key0: A
key1: B
key2:
- 2
key4: bar
结果:
msg:
- key0: A
key1: B
key2:
- 1
- key0: A
key1: B
key2:
- 2
而不是:
msg:
- key0: A
key1: B
remove_keys
不是一个选项,因为它也是递归工作的,并且不需要的键的数量比所需的键的数量大得多。由于 keep_keys
不提供非递归工作的选项,我认为必须有另一种方法来实现这一点,但我无法弄清楚。
除了开发自己的过滤器之外,还有没有办法以非递归方式将密钥保存在 Ansible 中?
使用金贾。例如,
keep: [key0, key1]
result: |
{% filter from_yaml %}
{% for i in my_list %}
- {{ dict(keep|zip(keep|map('extract', i))) }}
{% endfor %}
{% endfilter %}
给予
result:
- {key0: A, key1: B}
- {key0: A, key1: B}
用于测试的完整剧本示例
- hosts: localhost
vars:
my_list:
- key0: A
key1: B
key2: [1]
key3: foo
- key0: A
key1: B
key2: [2]
key4: bar
keep: [key0, key1]
result: |
{% filter from_yaml %}
{% for i in my_list %}
- {{ dict(keep|zip(keep|map('extract', i))) }}
{% endfor %}
{% endfilter %}
tasks:
- debug:
var: result|to_yaml
- debug:
var: result|unique
为什么两者都没有一个选项:
为了指定我是否希望递归地删除键,恕我直言,这是一件微不足道的事情,应该成为这些模块的一部分。同样的情况也适用于这些模块的合作伙伴中的 keep_keys。
对 ansible 有点沮丧...