Puncte:0

ansible/jinja extrag mai multe atribute din returnarea json complexă, respingând anumite potriviri

drapel vn

Încerc să extrag mai multe atribute dintr-o sarcină utilă complexă returnată de la un apel API în timp ce resping membrii care au o anumită valoare în câmpul „nume”. Luați în considerare următoarea sarcină utilă:

{
„npod_volumes”: {
    „schimbat”: fals,
    „eșuat”: fals,
    „volume”: [
        {
            „accessible_by_host_uuids”: [
                „9e8ba77c-8e09-4c69-b893-876742f83f34”,
                „ad5a5431-17e1-4023-8373-a6cf64cc5151”,
                „3333a278-414b-45d1-8972-611115c76f87”,
                „1e36d01a-f936-4249-9045-28232bb103e7”
            ],
            „boot”: fals,
            "creation_time": "2022-01-26T18:25:46",
            "current_owner_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            „expiration_time”: nul,
            "lun_uuids": [
                „8cfe80b6-5773-41bd-b175-e6e495ca0023”,
                „8e54f045-89dd-462a-bab4-552ed745ed24”,
                „136d7028-2b20-41c7-8b30-e104d211242c”,
                „4e7aac12-3b29-41c7-b016-36556feea9f1”
            ],
            "nume": "VMware_Lenovo_VV7",
            "natural_backup_host_uuid": "9e8ba77c-8e09-4c69-b893-876742f83f34",
            "natural_backup_spu_serial": "xxxxxxxx",
            "natural_owner_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            "natural_owner_spu_serial": "xxxxxxxx",
            "npod_uuid": "4b60437a-f8dc-4c80-b4b2-51b64b790487",
            „read_only_snapshot”: fals,
            „size_bytes”: 4000000000000,
            „snapshot_parent_uuid”: nul,
            „snapshot_uuids”: nul,
            "sync_state": "InSync",
            "uuid": "ed73e3a0-25e2-4672-8048-84ad4468c0d7",
            "wwn": "6f497c2006174fed000ab00000007000"
        },
        {
            „accessible_by_host_uuids”: [
                „9e8ba77c-8e09-4c69-b893-876742f83f34”,
                „1e36d01a-f936-4249-9045-28232bb103e7”,
                „ad5a5431-17e1-4023-8373-a6cf64cc5151”,
                „3333a278-414b-45d1-8972-611115c76f87”
            ],
            „boot”: fals,
            "creation_time": "2022-01-26T18:25:40",
            "current_owner_host_uuid": "9e8ba77c-8e09-4c69-b893-876742f83f34",
            „expiration_time”: nul,
            "lun_uuids": [
                „49e511b7-2b5f-4727-ac63-de12c4b6eb45”,
                „2baba8a4-dd23-4be4-ad9d-47580efa60d2”,
                „4ff844d6-c677-4c2a-a2e5-c13a5c062b3c”,
                „21e7f0c8-5f1a-438f-b503-e568f3691c01”
            ],
            "nume": "VMware_Lenovo_VV4",
            "natural_backup_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            "natural_backup_spu_serial": "xxxxxxxx",
            "natural_owner_host_uuid": "9e8ba77c-8e09-4c69-b893-876742f83f34",
            "natural_owner_spu_serial": "xxxxxxxx",
            "npod_uuid": "4b60437a-f8dc-4c80-b4b2-51b64b790487",
            „read_only_snapshot”: fals,
            „size_bytes”: 4000000000000,
            „snapshot_parent_uuid”: nul,
            „snapshot_uuids”: nul,
            "sync_state": "InSync",
            „uuid”: „cc3991e2-5443-4bd0-a75d-3e8341d26282”,
            "wwn": "6f497c2006174fed000ab00000004000"
        },
        {
            „accessible_by_host_uuids”: [
                „ad5a5431-17e1-4023-8373-a6cf64cc5151”
            ],
            „boot”: adevărat,
            "creation_time": "2022-01-26T18:25:46",
            "current_owner_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            „expiration_time”: nul,
            "lun_uuids": [
                „d5ce25a9-15d1-4e36-878e-5e645ef0c557”
            ],
            "name": "VMware_Lenovo_server-09.tme.nebulon.com_os",
            "natural_backup_host_uuid": "9e8ba77c-8e09-4c69-b893-876742f83f34",
            "natural_backup_spu_serial": "xxxxxxxx",
            "natural_owner_host_uuid": "ad5a5431-17e1-4023-8373-a6cf64cc5151",
            "natural_owner_spu_serial": "xxxxxxxx",
            "npod_uuid": "4b60437a-f8dc-4c80-b4b2-51b64b790487",
            „read_only_snapshot”: fals,
            „size_bytes”: 20000000000,
            „snapshot_parent_uuid”: nul,
            „snapshot_uuids”: nul,
            "sync_state": "InSync",
            „uuid”: „bdbce49d-834d-438e-a56d-9c384bc229c0”,
            "wwn": "6f497c2006174fed000ab00000000000"
        }
    ]
}

}

Din această returnare, trebuie să stochez câmpurile „nume” și „wwn” pentru fiecare volum. În plus, trebuie să resping orice volum care conține „_os” în câmpul „nume”.

Pot obține informațiile folosind un json_query, dar nu mi-am dat seama cum să resping volumele cu „_os” în numele lor folosind această abordare.

- nume: Setați numele volumului și WWN
  set_fact:
    volume_pairs: „{{ npod_volumes | json_query(volume_query) }}”
  vars: 
    volume_query: „volume[].{nume: nume, wwn: wwn}”
  tag-uri: volume

Aceasta oferă următoarea ieșire care include volumul nedorit „VMware_Lenovo_server-09.tme.nebulon.com_os”.

ok: [127.0.0.1] => {
„volume_pairs”: [
    {
        "nume": "VMware_Lenovo_VV7",
        „wwn”: „6f497c2006187474000ab00000007000”
    },
    {
        "nume": "VMware_Lenovo_VV4",
        „wwn”: „6f497c2006187474000ab00000004000”
    },
    {
        "name": "VMware_Lenovo_server-09.tme.nebulon.com_os",
        "wwn": "6f497c2006187474000ab00000000000"
    }
]

}

Vă mulțumim anticipat pentru timpul și considerația acordată!

Puncte:0
drapel vn

Așa că am ajuns la această soluție. Folosind „rejectattr” omit toate volumele care conțin „_os” în nume. Probabil că ar putea fi făcut într-un mod mai elegant, care să excludă nevoia mea de a folosi o interogare json, dar își face treaba.

  - nume: filtrează volumele OS
    set_fact:
      shared_volumes: „{{ npod_volumes.volumes | 
                        rejectattr('nume', 'contine', '_os') | 
                        sort(atribut='nume') | lista }}"
    înregistrare: rezultat
    tag-uri: volume  

  # Aceasta creează o listă de nume de volume și WWN-urile acestora
  - nume: Setați numele volumului și WWN
    set_fact:
      volume_pairs: „{{ shared_volumes | json_query(volume_query) }}”
    vars: 
      volum_query: „[].{nume: nume, wwn: wwn}”
    tag-uri: volume



# {
# "volume_pairs": [
# {
# "nume": "VMware_Lenovo_VV4",
# "wwn": "6f497c2006187474000ab00000004000"
#},
# {
# "nume": "VMware_Lenovo_VV5",
# "wwn": "6f497c2006187474000ab00000005000"
#},
# {
# "nume": "VMware_Lenovo_VV6",
# "wwn": "6f497c2006187474000ab00000006000"
#},
# {
# "nume": "VMware_Lenovo_VV7",
# "wwn": "6f497c2006187474000ab00000007000"
#}
# ]
#}
Zeitounator avatar
drapel fr
În cele mai multe situații (de exemplu, bucla ulterioară pe lista de dict), cel mai probabil puteți renunța la pasul `json_query` și puteți utiliza direct `shared_volumes` abordând numai atributele necesare pentru fiecare element (`name` și `wwn`). Rețineți că `json_query` trece deja peste întreaga listă pentru a copia elementele reduse într-o nouă variabilă. Utilizarea lor pe primul loc este probabil mai bună în ceea ce privește utilizarea resurselor de procesare.

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.