如何以非递归方式将密钥保存在 Ansible 中?

问题描述 投票:0回答:2

我想从字典列表中删除一些键(嵌套级别 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 中?

dictionary ansible key ansible-filter
2个回答
3
投票

使用金贾。例如,

  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

0
投票

为什么两者都没有一个选项:

  1. https://docs.ansible.com/ansible/devel//collections/community/general/remove_keys_filter.html
  2. https://docs.ansible.com/ansible/latest/collections/ansible/utils/remove_keys_filter.html

为了指定我是否希望递归地删除键,恕我直言,这是一件微不足道的事情,应该成为这些模块的一部分。同样的情况也适用于这些模块的合作伙伴中的 keep_keys。

对 ansible 有点沮丧...

© www.soinside.com 2019 - 2024. All rights reserved.