Ansible

使用項目列表搜尋字典列表,並查找該項目是否存在於屬性“值”下。僅將未找到的項目儲存為新列表

  • July 14, 2021

這個已經讓我跺了好一陣子了。希望各位大神幫忙。

我有一個註冊的字典列表,如下例所示(這些是來自防火牆的“對象”)

"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

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