Возможность обновления списка словаря на основе определенного условия

Я хотел обновить список с помощью ansible, который содержит элементы словаря на основе определенных условий.

например:

      list1:
  - {"name": "test1", "uid": 100, "gid": 250}
  - {"name": "test2", "uid": 101, "gid": 250}
  - {"name": "test3", "uid": 103, "gid": 250}
  - {"name": "test4", "uid": 104, "gid": 250}

list2: [100, 101]

list3: [102,103]

если uid совпадает с элементом в списке 2, он изменится gid=300, а если совпадает со списком 3, он обновится до 400, остальные элементы в списке 1 останутся прежними.

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

1 ответ

Например

          - set_fact:
        l4: "{{ l4|d([]) + [item|combine({'gid': _gid|from_yaml})] }}"
      loop: "{{ list1 }}"
      vars:
        _gid: |
          {% if item.uid in list2 %}
          300
          {% elif item.uid in list3 %}
          400
          {% else %}
          {{ item.gid }}
          {% endif %}

дает

        l4|to_yaml: |-
    - {gid: 300, name: test1, uid: 100}
    - {gid: 300, name: test2, uid: 101}
    - {gid: 400, name: test3, uid: 103}
    - {gid: 250, name: test4, uid: 104}

Обновлять

В Ansible 2.12 и более поздних версиях нет необходимости перебирать список. Вместо этого обновите список в канале. Выражения ниже дают тот же результат

      dict_default: "{{ list1|items2dict(key_name='uid', value_name='gid') }}"
dict_x: "{{ dict_default|
            combine(dict(list2|product([300]) + list3|product([400]))) }}"
gid_x: "{{ list1|map(attribute='uid')|map('extract', dict_x)|list }}"
gid_x_update: "{{ gid_x|map('community.general.dict_kv', 'gid')|list }}"
list4: "{{ list1|zip(gid_x_update)|map('combine')|list }}"
Подробности
       dict_default:
  100: 250
  101: 250
  103: 250
  104: 250

dict_x:
  100: 300
  101: 300
  102: 400
  103: 400
  104: 250

gid_x:
  - 300
  - 300
  - 400
  - 250

gid_x_update:
  - gid: 300
  - gid: 300
  - gid: 400
  - gid: 250
Другие вопросы по тегам