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 parancssori felületi kimenetből való kiválasztását és módosítását.
A --query paramétert az Azure CLI összes parancsa támogatja. 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 hasznosak a fogalmak lapon történő lekérdezéshez. JMESPath-lekérdezések példái a Példák lapon.
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 CloudShellben vagy a 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 akkor is JSON-ként lesznek kezelve a lekérdezésekhez, ha nem JSON kimeneti formátumot használnak. A parancssori felület eredményei JSON-tömbök vagy szótárak. A tömbök indexelhető objektumsorozatok, a szótárak pedig kulcsokkal elérhető rendezetlen objektumok.
Az alábbi példa egy tömbre mutat be:
[
1,
2,
3
]
Az alábbi példa egy szótárra mutat be:
{
"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, szótárt adnak vissza.
Tulajdonságok lekérése szótárban
A szótáreredmények használatával 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 ki lett hagyva.
{
"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
},
....
}
A következő parancs lekérdezés hozzáadásával lekéri a virtuális géphez való csatlakozásra jogosult SSH nyilvános kulcsokat:
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"
}
]
Vegye figyelembe, hogy a lekérdezési sztringek megkülönböztetik a kis- és nagybetűket. Ha például a fenti 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, szögletes zárójelekbe (több kijelölési listába) helyezze a kifejezéseket vesszővel [ ] elválasztva. A következő parancs egyszerre lekéri a virtuális gép nevét, a rendszergazda felhasználóját és az SSH-kulcsot:
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 a lekérdezésben megadott sorrendben jelennek meg az eredménytömbben. 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 az alábbi szakaszt.
Tulajdonságok átnevezése lekérdezésben
Ha tömb helyett szótárt szeretne lekérni több érték lekérdezéséhez, használja a { } (többszörös kijelölésű kivonat) operátort.
A többszörös kijelölésű kivonat formátuma: {displayName:JMESPathExpression, ...}.
displayName A a kimenetben megjelenő sztring lesz, és JMESPathExpression a kiértékelendő JMESPath-kifejezés. A példa módosítása az utolsó szakaszból a többszörös kijelölési lista kivonatra való módosításával:
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ömbnek nincsenek saját tulajdonságai, de indexelhető. Ez a funkció jelenik meg az utolsó példában a tömb első elemét publicKeys beolvasó kifejezésselpublicKeys[0]. A parancssori felület kimenetének rendezése nem garantált, 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űveletet kell végrehajtania: egybesimítást vagy szűrést. Ez a szakasz a tömbök egybesimítását ismerteti.
A tömbök egybesimítása a [] JMESPath operátorral történik. Az operátort követő [] összes kifejezés az aktuális tömb minden elemére alkalmazva lesz.
Ha [] a lekérdezés elején megjelenik, a parancssori felület parancseredményét simítja. Az eredmények ezzel a az vm list funkcióval vizsgálhatók meg.
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ést osProfile.linuxConfiguration.ssh.publicKeys[0].keyData az SSH nyilvános kulcsának lekérésére használták a bejelentkezéshez. Az összes nyilvános SSH-kulcs lekéréséhez a kifejezés írható a következőkéntosProfile.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éhez 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 annak tartalmaként. A predikátum bármely olyan utasítás, beleértve a logikai tulajdonságokat is, amelyek kiértékelhetők vagy truefalse. Azok a kifejezések, amelyekben a predikátum kiértékelése true szerepel a kimenetben.
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ódszert mutat be az összes olyan előfizetés listázására, 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 szabványos összehasonlító és logikai operátorokat kínál. Ezek közé tartozik a <, <=, >, >===, és !=. A JMESPath a logikai és (&&) vagy (||) és nem (!) függvényeket is támogatja. A kifejezések zárójelek között csoportosíthatók, így összetettebb predikátumkifejezések is használhatók. A predikátumokkal és 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
A numerikus értékeket, például az operációs rendszer lemezméretét is szűrheti. 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éhez.
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 JMESPath-ban a sztringeket mindig szimpla idézőjelek (') vagy feloldókarakterek (`) veszik körül. Ha dupla idézőjeleket használ egy sztring részeként egy szűrő predikátumban, üres kimenetet kap.
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 Kimenet módosítása függvényekkel című szakasz bemutatja, hogyan lehet függvényeket használni a kimenet módosításához.
A függvény meghívása előtt a függvény kiértékeli a kifejezéseket, így maguk az argumentumok JMESPath-kifejezések lehetnek. Az alábbi példák ezt a sztringek alsztringet tartalmazó sztringjének ellenőrzésére szolgáló használatával contains(string, substring)szemléltetik. 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 JMESPath-lekérdezésekben is használható kifejezések köztes lekérdezési eredményekre való alkalmazásához. Az összetett lekérdezéseket egyszerűbb alkifejezésekre is | fel lehet bontani. 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"
}
]
A függvények teljes listájáért tekintse meg a JMESPath specifikációját – Beépített függvények .
Kimenetek manipulálása függvényekkel
A JMESPath-függvények másik rendeltetése a lekérdezés eredményeinek üzemeltetése. Minden olyan függvény, amely nem logikai értéket ad vissza, megváltoztatja egy kifejezés eredményét. Az adatokat rendezheti például tulajdonságértékek szerint 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
A függvények teljes listájáért tekintse meg a JMESPath specifikációját – Beépített függvények .
Lekérdezési eredmények formázása
Az Azure CLI a JSON-t használja alapértelmezett kimeneti formátumként, de a különböző kimeneti formátumok jobban megfelelhetnek a lekérdezésnek a céltól és az eredményektől függően. Vegye figyelembe, hogy a lekérdezések mindig a JSON kimeneten futnak először, majd formázva lesznek.
Ez a szakasz végighalad tsv a formázáson és table néhány használati eseten az egyes formátumokhoz. 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 sortöréssel tagolt értékeket ad vissza, további formázások, kulcsok vagy egyéb szimbólumok nélkül. Ez akkor hasznos, ha a kimenetet egy másik parancs használja.
A formázás egyik tsv használati esete az a lekérdezés, amely egy CLI-parancsból kér le egy értéket, például egy Azure-erőforrásazonosítót vagy erőforrásnevet, é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. Ez problémát okozhat a karakterek közé " 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 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"
Ha meg szeretné akadályozni, hogy a visszatérési értékeket típusadatokkal együtt tartalmazza, használja tsv a következő lekérdezésben bemutatott formázást:
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, ezért 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.
Megjegyzé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öbbszörös kijelölésű kivonatban.
az vm show --resource-group QueryDemo --name TestVM --query "{objectID:id}" --output table
Ezt 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 --output table kombinálva az oszlopnevek megegyeznek 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: