Azure CLI-parancs kimenetének lekérdezése JMESPath-lekérdezéssel

Az Azure CLI a --query paraméterrel hajt végre egy JMESPath-lekérdezést a parancsok eredményein. A JMESPath a JSON lekérdezési nyelve, amely lehetővé teszi az adatok cli-kimenetből való kiválasztását és módosítását.

Az Azure CLI minden parancsa támogatja a paramétert --query . Ez a cikk a JMESPath funkcióinak használatát ismerteti, és példákat ad a lekérdezésekre. Ismerje meg a JMESPath fogalmait, amelyek a fogalmak lapon való lekérdezéshez hasznosak. A példák lap JMESPath-lekérdezéseinek példáit tekinti meg.

Az Azure CLI lekérdezésekkel választja ki és módosítja az Azure CLI-parancsok kimenetét. A lekérdezések ügyféloldali végrehajtása az Azure CLI-parancs visszaadott JSON-objektumán történik a megjelenítési formázás előtt.

A lekérdezésekben szükséges feloldó karakterek különböző környezetekben különböznek. Javasoljuk, hogy lekérdezéseket futtasson az Azure Cloud Shellben vagy parancsmagban, mert ezek a rendszerhéjak kevesebb feloldó karaktert igényelnek. Ha meg szeretné győződni arról, hogy a lekérdezési példák szintaktikailag helyesek, válassza ki a használt rendszerhéj lapját.

A parancssori felület eredményeinek szótára és listázása

A parancssori felület parancseredményei először JSON-ként lesznek kezelve a lekérdezésekhez, még akkor is, ha a kimeneti formátum nem JSON. A parancssori felület eredményei egy JSON-tömb vagy szótár. A tömbök indexelhető objektumok sorozatai, a szótárak pedig kulcsokkal elérhető rendezetlen objektumok.

Ez egy példa egy tömbre:

[ 
  1,
  2,
  3
]

Ez egy példa egy szótárra:

{
  "isRunning": false,
  "time": "12:00",
  "number": 1
}

Azok a parancsok, amelyek több objektumot is visszaadhatnak, tömböt adnak vissza, és azok a parancsok, amelyek mindig csak egyetlen objektumot adnak vissza, egy szótárt adnak vissza.

Tulajdonságok lekérése szótárban

A szótár eredményeivel a legfelső szinten lévő tulajdonságokat csak a kulccsal érheti el. A . (subexpression) karakter a beágyazott szótárak tulajdonságainak eléréséhez használható. A lekérdezések bevezetése előtt tekintse meg az az vm show parancs nem módosított kimenetét:

az vm show --resource-group QueryDemo --name TestVM

A parancs egy szótárt ad ki. Néhány tartalom kimaradt.

{
  "additionalCapabilities": null,
  "availabilitySet": null,
  "diagnosticsProfile": {
    "bootDiagnostics": {
      "enabled": true,
      "storageUri": "https://xxxxxx.blob.core.windows.net/"
    }
  },
  ...
  "osProfile": {
    "adminPassword": null,
    "adminUsername": "azureuser",
    "allowExtensionOperations": true,
    "computerName": "TestVM",
    "customData": null,
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "provisionVmAgent": true,
      "ssh": {
        "publicKeys": [
          {
            "keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
            "path": "/home/azureuser/.ssh/authorized_keys"
          }
        ]
      }
    },
    "secrets": [],
    "windowsConfiguration": null
  },
  ....
}

Az alábbi parancs lekéri a virtuális géphez való csatlakozáshoz engedélyezett nyilvános SSH-kulcsokat egy lekérdezés hozzáadásával:

az vm show --resource-group QueryDemo --name TestVM --query "osProfile.linuxConfiguration.ssh.publicKeys"
[
  {
    "keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
    "path": "/home/azureuser/.ssh/authorized_keys"
  }
]

A lekérdezési sztringek megkülönböztetik a kis- és nagybetűket. Ha például az előző lekérdezésben az "osProfile" értéket "OsProfile" értékre módosítja, az nem a megfelelő eredményeket adja vissza.

Több érték lekérése

Ha egynél több tulajdonságot szeretne lekérni, a kifejezéseket vesszővel elválasztva helyezze szögletes zárójelekbe [ ] ( több kijelölési listába). A következő parancs egyszerre lekéri a virtuális gép nevét, rendszergazdai felhasználóját és SSH-kulcsát:

az vm show --resource-group QueryDemo --name TestVM --query "[name, osProfile.adminUsername, osProfile.linuxConfiguration.ssh.publicKeys[0].keyData]"
[
  "TestVM",
  "azureuser",
  "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
]

Ezek az értékek az eredménytömbben a lekérdezésben megadott sorrendben jelennek meg. Mivel az eredmény tömb, az eredményekhez nincsenek kulcsok társítva. Ha tömb helyett szótárt szeretne lekérni, tekintse meg a következő szakaszt.

Tulajdonságok átnevezése lekérdezésben

Ha tömb helyett szótárt szeretne lekérni több érték lekérdezésekor, használja a { } (többszörös kijelölésű kivonat) operátort. A többszörös kijelölésű kivonat formátuma a következő {displayName:JMESPathExpression, ...}: . displayName a kimenetben megjelenő sztring, és JMESPathExpression a kiértékelendő JMESPath-kifejezés. Módosítsa a példát az utolsó szakaszból úgy, hogy a többszörös kijelölési listát kivonatra módosítja:

Feljegyzés

Ha úgy dönt, hogy egy új oszlopnévben használ szóközt, például VM name ahelyett VMName, az idéző szabályok a Bashben és a PowerShellben is megváltoznak. Példákért lásd az Azure CLI-paraméterek szóközeinek átadása című témakört.

az vm show --resource-group QueryDemo --name TestVM --query "{VMName:name, admin:osProfile.adminUsername, sshKey:osProfile.linuxConfiguration.ssh.publicKeys[0].keyData}"
{
  "VMName": "TestVM",
  "admin": "azureuser",
  "ssh-key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
}

Tulajdonságok lekérése tömbben

A tömbök nem rendelkeznek saját tulajdonságokkal, de indexelhetők. Ez a funkció az utolsó példában a tömb első elemét lekérő kifejezéssel publicKeys[0]jelenik publicKeys meg. Nincs garancia arra, hogy a parancssori felület kimenete rendezve van, ezért kerülje az indexelés használatát, hacsak nem biztos a sorrendben, vagy nem érdekli, hogy melyik elemet kapja. A tömb elemeinek tulajdonságainak eléréséhez két művelet egyikét kell elvégeznie: az összesimítást vagy a szűrést. Ez a szakasz egy tömb összesimítását ismerteti.

A tömbök összesimítása a [] JMESPath operátorral történik. Az operátort [] követő összes kifejezés az aktuális tömb egyes elemeire lesz alkalmazva. Ha [] a lekérdezés elején megjelenik, a parancssori felületi parancs eredményének felsimítására lesz szükség. Az eredmények az vm list ezzel a funkcióval vizsgálhatók. Az alábbi lekérdezés lekéri az erőforráscsoport egyes virtuális gépeinek nevét, operációs rendszerét és rendszergazdai nevét:

az vm list --resource-group QueryDemo --query "[].{Name:name, OS:storageProfile.osDisk.osType, admin:osProfile.adminUsername}"
[
  {
    "Name": "Test-2",
    "OS": "Linux",
    "admin": "sttramer"
  },
  {
    "Name": "TestVM",
    "OS": "Linux",
    "admin": "azureuser"
  },
  {
    "Name": "WinTest",
    "OS": "Windows",
    "admin": "winadmin"
  }
]

Bármely tömb simítható, nem csak a parancs által visszaadott legfelső szintű eredmény. Az utolsó szakaszban a kifejezés osProfile.linuxConfiguration.ssh.publicKeys[0].keyData az SSH nyilvános kulcsának lekérésére szolgál a bejelentkezéshez. Az összes nyilvános SSH-kulcs lekéréséhez a kifejezés a következőképpen írhatóosProfile.linuxConfiguration.ssh.publicKeys[].keyData: . Ez a lekérdezési kifejezés simítja a osProfile.linuxConfiguration.ssh.publicKeys tömböt, majd futtatja a kifejezést az keyData egyes elemeken:

az vm show --resource-group QueryDemo --name TestVM --query "{VMName:name, admin:osProfile.adminUsername, sshKeys:osProfile.linuxConfiguration.ssh.publicKeys[].keyData }"
{
  "VMName": "TestVM",
  "admin": "azureuser",
  "sshKeys": [
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso\n"
  ]
}

Tömbök szűrése logikai kifejezésekkel

A tömb adatainak lekérésére használt másik művelet a szűrés. A szűrés a [?...] JMESPath operátorral történik. Ez az operátor egy predikátumot vesz fel a tartalmaként. A predikátum bármely olyan utasítás (beleértve a logikai tulajdonságokat is), amely kiértékelhető vagy truefalse. Azokat a kifejezéseket, amelyekben a predikátum kiértékeli, true a kimenet tartalmazza.

Az első lekérdezés bemutatja, hogyan listázhatja a fiókhoz csatlakoztatott összes Azure-előfizetés nevét, amelynek isDefault a tulajdonsága igaz. A második és a harmadik lekérdezés két különböző módon jeleníti meg az összes olyan előfizetést, amelynek isDefault a tulajdonsága hamis.

# Boolean values are assumed to be true, so you can directly evaluate the isDefault property to return the default subscription.
az account list --query "[?isDefault].name"

# To check if a Boolean property is false, you can use the comparison operator == or the logical operator !.
az account list --query '[?!isDefault].name'
az account list --query "[?isDefault == \`false\`].name"

A JMESPath standard összehasonlítási és logikai operátorokat kínál. Ezek közé tartoznak a következők: <, <=, >, >===és !=. A JMESPath emellett támogatja a logikai és (&&), vagy (||) és nem () függvényt!. A kifejezések zárójelen belül csoportosíthatók, így összetettebb predikátumkifejezések is használhatók. A predikátumokkal és a logikai műveletekkel kapcsolatos részletes információkért tekintse meg a JMESPath specifikációját.

Az utolsó szakaszban összesimított egy tömböt, hogy lekérje az erőforráscsoport összes virtuális gépének teljes listáját. Szűrők használatával ez a kimenet csak Linux rendszerű virtuális gépekre korlátozható:

az vm list --resource-group QueryDemo --query "[?storageProfile.osDisk.osType=='Linux'].{Name:name,  admin:osProfile.adminUsername}" --output table
Name    Admin
------  ---------
Test-2  sttramer
TestVM  azureuser

Numerikus értékeket is szűrhet, például az operációsrendszer-lemez méretét. Az alábbi példa bemutatja, hogyan szűrheti a virtuális gépek listáját az 50 GB-nál nagyobb vagy annál nagyobb lemezméretű gépek megjelenítésére.

az vm list --resource-group QueryDemo --query "[?storageProfile.osDisk.diskSizeGb >=\`50\`].{Name:name,  admin:osProfile.adminUsername, DiskSize:storageProfile.osDisk.diskSizeGb }" --output table
Name     Admin     DiskSize
-------  --------  --------
WinTest  winadmin  127

Nagy tömbök esetén gyorsabb lehet a szűrő alkalmazása az adatok kiválasztása előtt.

Fontos

A JMESPathban a sztringeket mindig idézőjelek (') vagy feloldó karakterek (`) veszik körül. Ha kettős idézőjeleket használ egy sztring részeként egy szűrő predikátumában, üres kimenetet fog kapni.

JMESPath-függvények

A JMESPath beépített függvényekkel is rendelkezik, amelyek összetettebb lekérdezéseket és a lekérdezési kimenet módosítását teszik lehetővé. Ez a szakasz a JMESPath-függvények lekérdezések létrehozására való használatával foglalkozik, míg a Függvények kimenetének módosítása szakasz bemutatja, hogyan lehet függvényeket használni a kimenet módosítására.

A függvény meghívása előtt kiértékeljük a kifejezéseket, így maguk az argumentumok lehetnek JMESPath-kifejezések. Az alábbi példák ezt a fogalmat szemléltetik a következő paranccsal contains(string, substring), amely ellenőrzi, hogy egy sztring tartalmaz-e részsztringet. Ez a parancs megkeresi az operációsrendszer-lemezhez SSD-tárolót használó összes virtuális gépet:

az vm list --resource-group QueryDemo --query "[?contains(storageProfile.osDisk.managedDisk.storageAccountType,'SSD')].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType}"
[
  {
    "Name": "TestVM",
    "Storage": "StandardSSD_LRS"
  },
  {
    "Name": "WinTest",
    "Storage": "StandardSSD_LRS"
  }
]

Csőkifejezések

A parancssorban | használthoz | hasonlóan a JMESPath-lekérdezésekben is használható kifejezések közbenső lekérdezési eredményekre való alkalmazásához. Az összetett lekérdezéseket egyszerűbb részexpressziókra is feloszthatjuk | . Az előző szakasz lekérdezésének lerövidítéséhez használja | a szűrőt az adatok összesimítása és kiválasztása után.

az vm list --resource-group QueryDemo --query "[].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType} | [? contains(Storage,'SSD')]"
[
  {
    "Name": "TestVM",
    "Storage": "StandardSSD_LRS"
  },
  {
    "Name": "WinTest",
    "Storage": "StandardSSD_LRS"
  }
]

Tekintse meg a JMESPath specifikációját – Beépített függvények a függvények teljes listájához.

Kimenet manipulálása függvényekkel

A JMESPath-függvények más célra is szolgálnak, vagyis egy lekérdezés eredményein kell dolgozniuk. Bármely függvény, amely nemboolean értéket ad vissza, megváltoztatja egy kifejezés eredményét. Az adatokat például egy tulajdonságérték szerint rendezheti a következővel sort_by(array, &sort_expression): . A JMESPath egy speciális operátort használ a &függvény részeként később kiértékelendő kifejezésekhez. A következő példa bemutatja, hogyan rendezhet virtuálisgép-listát operációsrendszer-lemezméret szerint:

az vm list --resource-group QueryDemo --query "sort_by([].{Name:name, Size:storageProfile.osDisk.diskSizeGb}, &Size)" --output table
Name     Size
-------  ------
Test-2   30
TestVM   32
WinTest  127

Tekintse meg a JMESPath specifikációját – Beépített függvények a függvények teljes listájához.

Lekérdezési eredmények formázása

Az Azure CLI a JSON-t használja alapértelmezett kimeneti formátumként, azonban a különböző kimeneti formátumok jobban megfelelnek a lekérdezésnek a céltól és az eredményektől függően. A lekérdezések mindig először a JSON kimeneten futnak, majd formázódnak.

Ez a szakasz végighalad tsv a formázáson és table az egyes formátumok használati esetein. A kimeneti formátumokkal kapcsolatos további információkért tekintse meg az Azure CLI-parancsok kimeneti formátumait.

TSV kimeneti formátum

A tsv kimeneti formátum tabulátorral és új vonallal elválasztott értékeket ad vissza további formázás, kulcsok és egyéb szimbólumok nélkül. Ez a formátum akkor hasznos, ha a kimenet egy paraméterben van tárolva, és egy másik parancsban használatos.

A formázás egyik tsv használati esete az a lekérdezés, amely lekéri az értéket egy CLI-parancsból, például egy Azure-erőforrásazonosítóból vagy erőforrásnévből, és az értéket egy helyi környezeti változóban tárolja. Alapértelmezés szerint az eredmények JSON formátumban jelennek meg, ami problémát okozhat a karakterekbe " zárt JSON-sztringek kezelésekor. Előfordulhat, hogy a rendszerhéj nem értelmezi az idézőjeleket, ha a parancs kimenete közvetlenül a környezeti változóhoz van rendelve. Ez a probléma az alábbi példában látható, amely egy környezeti változóhoz rendel egy lekérdezési eredményt:

USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername")
echo $USER
"azureuser"

A következő lekérdezésben bemutatott formázással tsv megakadályozhatja a visszatérési értékek típusinformációkkal való beágyazását:

USER=$(az vm show --resource-group QueryDemo --name TestVM --query "osProfile.adminUsername" --output tsv)
echo $USER
azureuser

Tábla kimeneti formátum

A table formátum ASCII-táblaként jeleníti meg a kimenetet, így az könnyen olvasható és vizsgálható. Nem minden mező szerepel a táblában, így ez a formátum az adatok ember által kereshető áttekintéseként használható legjobban. A táblában nem szereplő mezők továbbra is szűrhetők egy lekérdezés részeként.

Feljegyzés

A táblanézetben a rendszer kiszűr egyes kulcsokat, így ezek nyomtatáskor nem jelennek meg. Ezek az id, a type és az etag. Ezeknek az értékeknek a megtekintéséhez módosíthatja a kulcs nevét egy több kijelöléses kivonatban.

az vm show --resource-group QueryDemo --name TestVM --query "{objectID:id}" --output table

Ezt a fogalmat egy korábbi lekérdezéssel szemléltethetjük. Az eredeti lekérdezés egy JSON-objektumot adott vissza, amely tartalmazza az erőforráscsoport egyes virtuális gépeinek nevét, operációs rendszerét és rendszergazdai nevét:

az vm list --resource-group QueryDemo --query "[].{Name:name, OS:storageProfile.osDisk.osType, admin:osProfile.adminUsername}"
[
  {
    "Name": "Test-2",
    "OS": "Linux",
    "admin": "sttramer"
  },
  {
    "Name": "TestVM",
    "OS": "Linux",
    "admin": "azureuser"
  },
  {
    "Name": "WinTest",
    "OS": "Windows",
    "admin": "winadmin"
  }
]

A kimeneti formátummal kombinálva az --output table oszlopnevek egyeznek a displayKey többszörös kijelölési kivonat értékével, így könnyebben áttekinthetők az információk:

az vm list --resource-group QueryDemo --query "[].{Name:name, OS:storageProfile.osDisk.osType, Admin:osProfile.adminUsername}" --output table
Name     OS       Admin
-------  -------  ---------
Test-2   Linux    sttramer
TestVM   Linux    azureuser
WinTest  Windows  winadmin

Következő lépések

A JMESPath-lekérdezésekről további információt a JMESPath-oktatóanyagban talál.

A cikkben említett egyéb Azure CLI-fogalmakkal kapcsolatos további információkért lásd: