ansible:获取子元素列表并声明重复项

时间:2019-03-26 19:21:12

标签: python testing ansible infrastructure

给一个字典,声明同一列表中的重复项。

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

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

进行一些研究后,我能够创建以下任务,该任务显示了每次执行中sender_domains的值。但是,我们真正想要的是来自每个名称的所有sender_domain的列表,以便以后可以断言重复。

- 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

1 个答案:

答案 0 :(得分:0)

为什么不呢?

- 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