Python

Ansible 根據特定條件更新字典列表

  • April 8, 2022

我想用 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

引用自:https://serverfault.com/questions/1067692