#ansible
Вопрос:
У меня есть два списка:
mylist1:
- name: cm-pr1
kind: ConfigMap
- name: sc-pr1
kind: Secret
- name: cm-pr2
kind: ConfigMap
mylist2:
- item:
name: cm-pr1
kind: ConfigMap
resources:
metadata:
resourceVersion: 100
- item:
name: sc-pr1
kind: Secret
resources:
metadata:
resourceVersion: 200
- item:
name: sc-pr2
kind: ConfigMap
resources: []
Я хотел бы получить значение resourceVersion
от mylist2
и добавить к mylist1
. Если ключ ресурсов пуст, то resourceVersion
следует установить значение null
Ожидаемый результат:
mylist1:
- name: cm-pr1
kind: ConfigMap
resourceVersion: 100
- name: sc-pr1
kind: Secret
resourceVersion: 200
- name: sc-pr2
kind: ConfigMap
resourceVersion: null
Я начал с:
- debug:
msg: "Repo: {{ item[0] }} and K8S: {{ item[1] }}"
# Instead debug, should be appending key: value to each dict in mylist1
with_nested:
- "{{ mylist1 }}"
- "{{ mylist2 }}"
when: item[0].name == item[1].item.name and item[0].kind == item[1].item.kind
mylist1
и mylist2
всегда содержат одинаковое количество элементов
Комментарии:
1. Всегда ли два начальных списка синхронизированы ? (т. Е. Всегда содержат одинаковое количество элементов в одном и том же порядке, которые соответствуют друг другу)
2. Я отредактировал свой пост и подробно объяснил
3.
names
Гарантированноmylist
ли они уникальны? Вы управляете источником данных-то есть, долженmylist
быть список, или вместо этого это может быть словарь?4.
name
иkind
уникальны вместе. Это должен быть список
Ответ №1:
Мое мнение
- hosts: localhost
gather_facts: false
vars:
mylist1:
- name: cm-pr1
kind: ConfigMap
- name: sc-pr1
kind: Secret
- name: cm-pr2
kind: ConfigMap
mylist2:
- item:
name: cm-pr1
kind: ConfigMap
resources:
metadata:
resourceVersion: 100
- item:
name: sc-pr1
kind: Secret
resources:
metadata:
resourceVersion: 200
- item:
name: sc-pr2
kind: ConfigMap
resources: [ ]
tasks:
- name: Create final list
set_fact:
final_list: >-
{{
final_list | default([])
[
item.0 | combine(
{'resourceVersion': item.1.resources.metadata.resourceVersion | default(None)}
)
]
}}
loop: "{{ mylist1 | zip(mylist2) }}"
- name: Show result
debug:
var: final_list
Что дает:
PLAY [localhost] ***********************************************************************************************************************************************************************************************************************
TASK [Create final list] ***************************************************************************************************************************************************************************************************************
Monday 05 July 2021 09:41:04 0200 (0:00:00.021) 0:00:00.021 ***********
ok: [localhost] => (item=[{'name': 'cm-pr1', 'kind': 'ConfigMap'}, {'item': {'name': 'cm-pr1', 'kind': 'ConfigMap'}, 'resources': {'metadata': {'resourceVersion': 100}}}])
ok: [localhost] => (item=[{'name': 'sc-pr1', 'kind': 'Secret'}, {'item': {'name': 'sc-pr1', 'kind': 'Secret'}, 'resources': {'metadata': {'resourceVersion': 200}}}])
ok: [localhost] => (item=[{'name': 'cm-pr2', 'kind': 'ConfigMap'}, {'item': {'name': 'sc-pr2', 'kind': 'ConfigMap'}, 'resources': []}])
TASK [Show result] *********************************************************************************************************************************************************************************************************************
Monday 05 July 2021 09:41:04 0200 (0:00:00.068) 0:00:00.090 ***********
ok: [localhost] => {
"final_list": [
{
"kind": "ConfigMap",
"name": "cm-pr1",
"resourceVersion": 100
},
{
"kind": "Secret",
"name": "sc-pr1",
"resourceVersion": 200
},
{
"kind": "ConfigMap",
"name": "cm-pr2",
"resourceVersion": null
}
]
}
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0