使用项目列表搜索字典列表,并查找该项目是否存在于属性“值”下。仅将未找到的项目存储为新列表

使用项目列表搜索字典列表,并查找该项目是否存在于属性“值”下。仅将未找到的项目存储为新列表

这个问题已经困扰我好久了。希望你们能帮忙。

我有一个注册的字典列表,如下面的示例所示(这些是来自防火墙的“对象”)

"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 项,但对于不存在的条目,我的变量被设置为列表“sources”+“AnsibleUndefined”中的所有项。

有没有办法让这个新列表仅包含未找到的项目“4.4.4.4”?这样我就可以使用新列表来创建丢失的对象。

答案1

问:新列表仅包含未找到的项目“4.4.4.4”。

答:例如

    - debug:
        msg: "{{ sources|difference(_values) }}"
      vars:
        _values: "{{ objects|map(attribute='value')|list }}"

给出

  msg:
  - 4.4.4.4

相关内容