Рейтинг:2

Найдите список Dicts, используя список элементов, и найдите, существует ли элемент под атрибутом «значение». Хранить только НЕ найденные элементы в виде нового списка

флаг in

Этот уже давно меня топает. Надеюсь, вы, ребята, можете помочь.

У меня есть список зарегистрированных диктов, как в примере ниже (это «объекты» из брандмауэра)

"объекты": [
      { 
         "имя": "Тест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»? Это позволило бы мне затем использовать новый список для создания отсутствующих объектов.

Drusstheledg3 avatar
флаг in
Извините, это опечатка. Это всего лишь примеры. Фактический список объектов dict содержит около 2000 записей. Как уже упоминалось, первая часть кода работает так, как задумано в нашей реальной среде.
Drusstheledg3 avatar
флаг in
Спасибо за отзыв Владимир. Я отредактировал пост, так что, надеюсь, теперь он более понятен.
Рейтинг:1
флаг br

Вопрос: "Новый список содержит только тот элемент, который не был найден «4.4.4.4»."

А: Например

    - отладка:
        msg: "{{ источники|разница(_значения)}}"
      вары:
        _values: "{{ объекты|карта(атрибут='значение')|список }}"

дает

  сообщение:
  - 4.4.4.4
Drusstheledg3 avatar
флаг in
Большое спасибо за быстрый ответ. Это сработало!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.