Ansible
使用項目列表搜尋字典列表,並查找該項目是否存在於屬性“值”下。僅將未找到的項目儲存為新列表
這個已經讓我跺了好一陣子了。希望各位大神幫忙。
我有一個註冊的字典列表,如下例所示(這些是來自防火牆的“對象”)
"objects": [ { "name": "Test1", "type": "ip-netmask", "value": "8.8.8.8" }, { "name": "Test2", "type": "ip-netmask", "value": "8.8.4.4" } ] }
使用稱為“源”的 IP 地址列表,我目前能夠搜尋“對象”中的“值”以查看它們是否存在。如果找到它們,我使用 set_fact 創建一個新列表,並使用與找到的“值”關聯的對象的“名稱”填充它。這工作正常。
我要解決的問題是如何創建一個新列表,其中包含在搜尋值時未找到的“來源”。
我查找現有“來源”並儲存為名稱的工作程式碼如下:
vars sources: ['8.8.8.8','8.8.4.4'] tasks: - name: Fetch all objects and store result panos_object_facts: provider: "{{ cli }}" device_group: DG_Test name_regex: '.*' object_type: 'address' register: result - name: Search result for our sources and store as list if found set_fact: existing_source_addr: "{{ existing_source_addr|default([]) + [(result.objects | selectattr('value', 'search', item ) | list | first).name ] }}" with_items: "{{ sources }}" - debug: var=existing_source_addr
這將返回一個範例,如下所示:
"existing_source_addr": "['Test1', 'Test2']"
下面的範例是我正在測試創建一個新列表的程式碼,該列表僅包含未找到的“來源”。這沒有按預期工作。
vars sources: ['8.8.8.8','8.8.4.4','4.4.4.4'] # 4.4.4.4 does not exist in our list of dicts 'objects' # tasks: - name: Fetch all objects and store result panos_object_facts: provider: "{{ cli }}" device_group: DG_Test name_regex: '.*' object_type: 'address' register: result - name: Search result for our sources and store as list if NOT found set_fact: non_existing_source_addr: "{{ non_existing_source_addr|default([]) + [item] }}" with_items: "{{ sources }}" when: item not in result.objects | selectattr('value', 'search', item ) | list - debug: var=non_existing_source_addr
這將返回一個範例,如下所示:
"non_existing_source_addr": "[u'8.8.8.8', u'8.8.4.4', AnsibleUndefined]"
條件為真,因為未按預期找到第 3 項,但我的變數正在設置為列表“源”+“AnsibleUndefined”中不存在的條目的所有項。
有沒有辦法讓這個新列表只包含未找到“4.4.4.4”的項目?這將允許我使用新列表來創建失去的對象。
問:“新列表僅包含未找到‘4.4.4.4’的項目。 ”
答:例如
- debug: msg: "{{ sources|difference(_values) }}" vars: _values: "{{ objects|map(attribute='value')|list }}"
給
msg: - 4.4.4.4