【问题标题】:ansible: get list of subelements and assert for duplicatesansible:获取子元素列表并断言重复
【发布时间】:2019-03-26 19:21:11
【问题描述】:

给定一个字典,断言同一列表中的重复项。

vars.yml 文件:

---
customer_domains:
  - name: myBank.org
  - name: myBakery.net
  - name: mySchool.edu
    smtp_username: smtp-school
    sender_domains:
      - sender1.tld
  - name: myRestaurant.net
  - name: myHouse.org
    smtp_relay_host: smtp-house.org
    smtp_relay_port: 25
    sender_domains:
      - test1.com
      - test1.com
      - test2.net
      - test3.house.net

我们真正想要的是确保每个 name 没有重复的 sender_domains。 允许使用相同的 sender_domains 但使用不同的 name

做了一些研究,我能够创建以下任务,它显示了每次执行中 sender_domains 的值。然而,我们真正想要的是每个 name 中所有 sender_domains 的列表,这样我们就可以在之后断言重复。

- name: DEBUG VAR=ITEM.1
  debug: var=item.1
  with_subelements:
    - "{{ customer_domains }}"
    - sender_domains

想法?

这可以打印 customer_domains var 的子元素:

- name: print customer_domains SUBELEMENTS
  debug:
    msg: "{{ item.1 }}"
  with_subelements:
    - "{{ scx_customer_domains }}"
    - sender_domains

【问题讨论】:

    标签: python testing ansible infrastructure


    【解决方案1】:

    为什么不这样?

    - name: assert unique sender_domains
      assert:
        that: item.sender_domains == item.sender_domains|uniq
      loop: '{{ customer_domains }}'
      when: '"sender_domains" in item'
    

    如果您想确保 sender_domains 是全球唯一的,您可以

    vars:
      all_sender_domains: '{{ customer_domains | map(attribute="sender_domains") | list | select("defined") | list | flatten }}'
    
    tasks:
    - assert:
        that:
          - all_sender_domains == all_sender_domains | uniq
    

    【讨论】:

    • 那行得通。如果我们希望它在 all sender_domains 列表中声明 dup,而不管它们属于哪个 name 列表怎么办?
    猜你喜欢
    • 2022-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2021-11-03
    • 1970-01-01
    • 2018-01-24
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多