Python
Ansible 根據特定條件更新字典列表
我想用 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 與 list2 中的項目匹配,它將更改 gid=300,如果與 list3 匹配,則將其更新為 400,其餘項目在 list1 中保持不變
請建議我如何在上述條件下生成 list1
例如
- 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