Puncte:2

Căutați o listă de Dict folosind o listă de articole și aflați dacă elementul există sub atributul „valoare”. Stocați numai articolele NU găsite ca listă nouă

drapel in

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ă.

Drusstheledg3 avatar
drapel in
Îmi pare rău, este o greșeală de scriere. Acestea sunt doar exemple. Lista actuală a dictelor „obiecte” are aproximativ 2000 de intrări. După cum am menționat, prima parte a codului funcționează așa cum este prevăzut în mediul nostru live.
Drusstheledg3 avatar
drapel in
Mulțumesc pentru feedback Vladimir. Am editat postarea, așa că sper că este mai ușor de înțeles acum.
Puncte:1
drapel br

Î: "Lista nouă conține doar elementul care nu a fost găsit „4.4.4.4”."

A: De exemplu

    - depanare:
        msg: "{{ surse|diferență(_valori) }}"
      vars:
        _values: „{{ obiecte|hartă(atribut=’valoare’)|listă }}”

  mesaj:
  - 4.4.4.4
Drusstheledg3 avatar
drapel in
Multumesc mult pentru raspunsul rapid. Aceasta a funcționat un răsfăț!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.