Ansible | Добавляющий ключ к каждому диктанту в списке

#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