Этот уже давно меня топает. Надеюсь, вы, ребята, можете помочь.
У меня есть список зарегистрированных диктов, как в примере ниже (это «объекты» из брандмауэра)
"объекты": [
{
"имя": "Тест1",
"тип": "ip-маска сети",
"значение": "8.8.8.8"
},
{
"имя": "Тест2",
"тип": "ip-маска сети",
"значение": "8.8.4.4"
}
]
}
Используя список IP-адресов под названием «источники», в настоящее время я могу искать «значения» в «объектах», чтобы увидеть, существуют ли они. Если они найдены, я создаю новый список с помощью set_fact и заполняю его «именем» объекта, связанного с найденным «значением». Это работает нормально.
Проблема, которую я пытаюсь решить, заключается в том, как я могу создать новый список с «источниками», которые НЕ найдены в моем поиске значений.
Мой рабочий код для поиска существующих «источников» и сохранения имен выглядит следующим образом:
вары
источники: ['8.8.8.8','8.8.4.4']
задачи:
- имя: Получить все объекты и сохранить результат
панорамы_объект_факты:
провайдер: "{{кли}}"
группа_устройств: DG_Test
name_regex: '.*'
object_type: 'адрес'
регистрация: результат
- имя: Результат поиска для наших источников и сохранение в виде списка, если найдено
set_fact:
существующий_источник_адрес: "{{ существующий_источник_адрес|по умолчанию([]) + [(результат.объекты | selectattr('значение', 'поиск', элемент) | список | имя).имя] }}"
with_items: "{{ источники }}"
- отладка: var=existing_source_addr
Это возвращает пример, как показано ниже:
"existing_source_addr": "['Тест1', 'Тест2']"
В приведенном ниже примере показан код, который я тестирую для создания нового списка, содержащего только «источники», которые НЕ найдены. Это не работает, как ожидалось.
вары
источники: ['8.8.8.8','8.8.4.4','4.4.4.4']
# 4.4.4.4 не существует в нашем списке объектов dicts #
задачи:
- имя: Получить все объекты и сохранить результат
панорамы_объект_факты:
провайдер: "{{кли}}"
группа_устройств: DG_Test
name_regex: '.*'
object_type: 'адрес'
регистрация: результат
- имя: Результат поиска для наших источников и сохранение в виде списка, если НЕ найдено
set_fact:
non_existing_source_addr: "{{ non_existing_source_addr|по умолчанию([]) + [элемент] }}"
with_items: "{{ источники }}"
когда: элемент отсутствует в результате.объекты | selectattr('значение', 'поиск', элемент ) | список
- отладка: var=non_existing_source_addr
Это возвращает пример, как показано ниже:
"non_existing_source_addr": "[u'8.8.8.8', u'8.8.4.4', AnsibleUndefined]"
Условие истинно, поскольку третий элемент не найден, как ожидалось, но моя переменная устанавливается со всеми элементами из списка «источники» + «AnsibleUndefined» для несуществующей записи.
Есть ли способ, чтобы этот новый список содержал ТОЛЬКО элемент, который не был найден «4.4.4.4»? Это позволило бы мне затем использовать новый список для создания отсутствующих объектов.