Возможность обновления списка словаря на основе определенного условия
Я хотел обновить список с помощью 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