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 true
false
. 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: