这个问题已经困扰我好久了。希望你们能帮忙。
我有一个注册的字典列表,如下面的示例所示(这些是来自防火墙的“对象”)
"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