Первый раз, когда я создаю пост здесь, в течение многих лет я находил решение своих проблем, но ... всегда бывает в первый раз ...
Я пытаюсь объединить два списка, чтобы сделать их комбинацию в возможной, если это возможно, избегая зацикливания, или только один максимальный
что я имею :
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, я бы хотел, чтобы было другое решение:/