Acesta mă ciocănește de ceva vreme. În speranța că vă puteți ajuta.
Am o listă de dictări înregistrate ca exemplul de mai jos (acestea sunt „obiecte” dintr-un firewall)
"obiecte": [
{
"nume": "Test1",
"type": "IP-netmask",
„valoare”: „8.8.8.8”
},
{
"nume": "Test2",
"type": "IP-netmask",
„valoare”: „8.8.4.4”
}
]
}
Folosind o listă de adrese IP numită „surse”, în prezent, pot căuta „valorile” în „obiecte” pentru a vedea dacă acestea există. Dacă sunt găsite, creez o nouă listă folosind set_fact și o populez cu „numele” obiectului asociat cu „valoarea” găsită. Acest lucru funcționează OK.
Problema pe care încerc să o rezolv este cum pot crea o nouă listă cu „sursele” care NU se găsesc în căutarea valorilor.
Codul meu de lucru pentru găsirea „surselor” existente și stocarea ca nume este după cum urmează:
vars
surse: ['8.8.8.8','8.8.4.4']
sarcini:
- nume: Preluați toate obiectele și stocați rezultatul
panos_object_facts:
furnizor: „{{ cli }}”
device_group: DG_Test
name_regex: '.*'
object_type: „adresă”
înregistrare: rezultat
- nume: rezultatul căutării pentru sursele noastre și stocați ca listă dacă este găsit
set_fact:
existent_source_addr: „{{ existent_source_addr|implicit([]) + [(result.objects | selectattr('value', 'search', item ) | list | first).name ] }}"
with_items: „{{ surse }}”
- depanare: var=existing_source_addr
Aceasta returnează un exemplu ca mai jos:
"existing_source_addr": "['Test1', 'Test2']"
Exemplul de mai jos este codul pe care îl testez pentru a crea o nouă listă care conține doar „sursele” care NU sunt găsite. Acest lucru nu funcționează așa cum era de așteptat.
vars
surse: ['8.8.8.8','8.8.4.4','4.4.4.4']
# 4.4.4.4 nu există în lista noastră de dict „obiecte” #
sarcini:
- nume: Preluați toate obiectele și stocați rezultatul
panos_object_facts:
furnizor: „{{ cli }}”
device_group: DG_Test
name_regex: '.*'
object_type: „adresă”
înregistrare: rezultat
- nume: Rezultatul căutării pentru sursele noastre și stocați-l ca listă dacă NU este găsit
set_fact:
non_existing_source_addr: „{{ non_existing_source_addr|implicit([]) + [articol] }}”
with_items: „{{ surse }}”
când: element nu în rezultat.obiecte | selectattr('valoare', 'căutare', element ) | listă
- depanare: var=non_existing_source_addr
Aceasta returnează un exemplu ca mai jos:
"non_existing_source_addr": "[u'8.8.8.8', u'8.8.4.4', AnsibleUndefined]"
Condiția este adevărată, deoarece al treilea element nu este găsit așa cum era de așteptat, dar variabila mea este setată cu toate elementele din lista „surse” + „AnsibleUndefined” pentru intrarea care nu există.
Există vreo modalitate ca această nouă listă să conțină DOAR elementul care nu a fost găsit „4.4.4.4”? Acest lucru mi-ar permite să folosesc apoi noua listă pentru a crea obiectele lipsă.