ansible: получение списка подэлементов и утверждение для дубликатов

#python #testing #ansible #infrastructure

#python #тестирование #ansible #инфраструктура

Вопрос:

Учитывая словарь, подтвердите наличие дубликатов в том же списке.

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_domains для каждого имени.
Допускаются одни и те же домены отправителя, но с разными именами.

Проведя небольшое исследование, я смог создать следующую задачу, которая показывает значение sender_domains при каждом выполнении. Однако, что нам действительно нужно, так это список всех sender_domains от каждого имени, чтобы впоследствии мы могли утверждать для дубликатов.

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

Мысли?

Это работает для печати подэлементов переменной customer_domains:

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

Ответ №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
  

Комментарии:

1. Это работает. Что, если мы хотим, чтобы он утверждал дубликаты во всех списках sender_domains, независимо от списков имен , к которым они принадлежат?