Ansible: объединить 2 списка хешей, объединить по ключу

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

Я пытаюсь объединить два списка, чтобы сделать их комбинацию в возможной, если это возможно, избегая зацикливания, или только один максимальный

что я имею :

list1:
  - name: toto
    attr: no
  - name: share
    sky: blue

list2:
  - name: tata
    attr: yes
  - name: toto
    attr: yes
  - name: share
    attr: no

list3: "{{ list1 }} + {{ list2 }}"

Я пробовал несколько вещей с картой / комбинацией / и т. д. ... но не закончил с ожидаемыми результатами

Что я хочу: объединить по имени ключа IE: общий ресурс должен иметь 3 ключа, дублирующиеся ключи должны быть переопределены, но это не имеет большого значения.

list3:
  - name: toto
    attr: yes
  - name: tata
    attr: yes
  - name: share
    sky: blue
    attr: no

Я нашел: Q: Ansible - Как я могу объединить 2 списка хэшей с общей парой ключ/значение Но имя ключа решения жестко закодировано, и я не мог его предсказать

Я был бы признателен за любую помощь (и мы можем получить пиво, если встретимся: p)

РЕДАКТИРОВАТЬ: с той же переменной определения я получил:

- set_fact:
    combin: >-
      {{ combin | default([])
         + [item | combine(time_item) | combine(proxy_item) ]
      }}
  vars:
    time_item: >-
      {{ list1
         | selectattr('name','equalto',item['name'])
         | list
      }}
    proxy_item: >-
      {{ list2
         | selectattr('name','equalto',item['name'])
         | list

      }}
  loop: "{{ list3 }}"
- debug: msg="{{ combin }}"

Что приводит к:

"msg": [
        {
            "attr": true, 
            "name": "toto"
        }, 
        {
            "attr": false, 
            "name": "share", 
            "sky": "blue"
        }, 
        {
            "attr": true, 
            "name": "tata"
        }, 
        {
            "attr": true, 
            "name": "toto"
        }, 
        {
            "attr": false, 
            "name": "share", 
            "sky": "blue"
        }
    ]

Значение объединено, но некоторое дублирование, я вынужден использовать объединенный список в качестве цикла здесь, потому что какой-то элемент в одном списке не обязательно существует в другом.

Для тех, кто может спросить: цель состоит в том, чтобы иметь помощника для слияния произвольного списка с произвольным ключом, как это сделает стратегия слияния в ansible.cfg... но без его включения. IE, чтобы определить некоторых пользователей в группах/всех, затем в hostvars, возможно, в файле vars и т. д.

РЕДАКТИРОВАТЬ: если я использую:

- debug: msg="{{ combin | unique }}"

Я избавлюсь от дубликата, но я вынужден использовать другой set_fact, я бы хотел, чтобы было другое решение:/


person ethan Ium    schedule 25.01.2019    source источник
comment
Вдохновитесь этим: stackoverflow.com/a/54348782/2795592   -  person Konstantin Suvorov    schedule 25.01.2019
comment
Я адаптировал свой случай, но у меня есть дубликат, я обновляю вопрос   -  person ethan Ium    schedule 25.01.2019
comment
забыл поблагодарить и нашел обходной путь, не очень доволен, но... работает   -  person ethan Ium    schedule 25.01.2019