Så här kör du frågor mot Azure CLI-kommandoutdata med hjälp av en JMESPath-fråga
Azure CLI använder argumentet --query för att utföra en JMESPath-fråga på resultaten från kommandon. JMESPath är ett frågespråk för JSON som ger dig möjlighet att välja och ändra data från CLI-utdata. Frågor körs på JSON-utdata innan någon visningsformatering.
Argumentet --query stöds av alla kommandon i Azure CLI. Den här artikeln beskriver hur du använder funktionerna i JMESPath med en serie små, enkla exempel.
Anteckning
När du använder Azure CLI i PowerShell på Windows kan vissa extra undantag vara nödvändiga för frågeargumentet. Mer information finns i Citera problem med PowerShell.
Cli-resultat för ordlista och lista
Även om du använder ett annat utdataformat än JSON behandlas CLI-kommandoresultaten först som JSON för frågor. CLI-resultaten är antingen en JSON-matris eller en ordlista. Matriser är sekvenser av objekt som kan indexeras och ordlistor är osorterade objekt som nås med nycklar. Kommandon som kan returnera fler än ett objekt returnerar en matris, och kommandon som alltid returnerar ett enda objekt returnerar en ordlista.
Hämta egenskaper i en ordlista
Om du arbetar med ordlisteresultat kan du komma åt egenskaper från den översta nivån med bara nyckeln. Tecknet . (subexpression) används för att komma åt egenskaper för kapslade ordlistor. Innan du introducerar frågor bör du ta en titt på de oförändrade utdata från az vm show kommandot:
az vm show -g QueryDemo -n TestVM -o json
Kommandot matar ut en ordlista. En del innehåll har utelämnats.
{
"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
},
....
}
Följande kommando hämtar de offentliga SSH-nycklarna som har behörighet att ansluta till den virtuella datorn genom att lägga till en fråga:
az vm show -g QueryDemo -n TestVM --query osProfile.linuxConfiguration.ssh.publicKeys -o json
[
{
"keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
"path": "/home/azureuser/.ssh/authorized_keys"
}
]
Hämta ett enskilt värde
Ett vanligt fall är att du bara behöver hämta ett värde från ett CLI-kommando, till exempel ett Azure-resurs-ID, ett resursnamn, ett användarnamn eller ett lösenord. I så fall vill du också ofta lagra värdet i en lokal miljövariabel. Om du vill hämta en enskild egenskap måste du först se till att du bara får ut en egenskap från frågan. Ändra det sista exemplet så att endast administratörens användarnamn visas:
az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o json
"azureuser"
Det här ser ut som ett giltigt enda värde, men observera att " tecknen returneras som en del av utdata. Detta anger att objektet är en JSON-sträng. Det är viktigt att observera att när du tilldelar det här värdet direkt som utdata från kommandot till en miljövariabel, kan citattecken inte tolkas av gränssnittet:
USER=$(az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o json)
echo $USER
"azureuser"
Det är nästan inte det du vill ha. I det här fallet vill du använda ett utdataformat som inte omsluter returnerade värden med typinformation. Det bästa utdataalternativet som CLI erbjuder för det här ändamålet är tsv tabbavgränsade värden. I synnerhet när du hämtar ett värde som bara är ett enda värde (inte en ordlista eller lista), kommer utdata garanterat tsv att vara utan citat.
az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o tsv
azureuser
Mer information om tsv utdataformatet finns i Utdataformat – TSV-utdataformat
Fråga booleska värden
Frågor mot booleska värden skiljer sig något åt. Det finns två alternativ:
# Boolean values are assumed to be true, so this syntax returns the current default subscription.
az account list --query "[?isDefault]"
# If you want a false value, use an escape character.
az account list --query "[?isDefault == \`false\`]"
Hämta flera värden
Om du vill hämta fler än en egenskap lägger du uttrycken inom [ ] hakparenteser (en lista med flera markeringar) som en kommaavgränsad lista. Om du vill hämta namnet på den virtuella datorn, administratörsanvändaren och SSH-nyckeln samtidigt använder du kommandot :
az vm show -g QueryDemo -n TestVM --query '[name, osProfile.adminUsername, osProfile.linuxConfiguration.ssh.publicKeys[0].keyData]' -o json
[
"TestVM",
"azureuser",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
]
Dessa värden visas i resultatmatrisen i den ordning som de har angetts i frågan. Eftersom resultatet är en matris finns det inga nycklar som är associerade med resultatet.
Byta namn på egenskaper i en fråga
Om du vill hämta en ordlista i stället för en matris när du frågar efter flera värden använder du operatorn { } (multiselect hash).
Formatet för en flervalshashar är {displayName:JMESPathExpression, ...} .
displayName är den sträng som visas i utdata och är JMESPathExpression JMESPath-uttrycket som ska utvärderas. Ändra exemplet från det sista avsnittet genom att ändra listan med flerval till en hash:
az vm show -g QueryDemo -n TestVM --query '{VMName:name, admin:osProfile.adminUsername, sshKey:osProfile.linuxConfiguration.ssh.publicKeys[0].keyData }' -o json
{
"VMName": "TestVM",
"admin": "azureuser",
"ssh-key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
}
Hämta egenskaper i en matris
En matris har inga egna egenskaper, men den kan indexeras. Den här funktionen visas i det sista exemplet med uttrycket publicKeys[0] , som hämtar det första elementet i publicKeys matrisen. Det finns ingen garanti för att CLI-utdata är ordnade, så undvik att använda indexering om du inte är säker på ordningen eller inte bryr dig om vilket element du får. Om du vill komma åt egenskaperna för elementen i en matris gör du en av två åtgärder: platta ut och filtrera. Det här avsnittet beskriver hur du plattar ut en matris.
Utplattning av en matris görs med [] JMESPath-operatorn. Alla uttryck efter [] operatorn tillämpas på varje element i den aktuella matrisen.
Om [] visas i början av frågan plattas CLI-kommandoresultatet ut. Resultatet av az vm list kan inspekteras med den här funktionen.
Hämta namn, operativsystem och administratörsnamn för varje virtuell dator i en resursgrupp:
az vm list -g QueryDemo --query '[].{Name:name, OS:storageProfile.osDisk.osType, admin:osProfile.adminUsername}' -o json
[
{
"Name": "Test-2",
"OS": "Linux",
"admin": "sttramer"
},
{
"Name": "TestVM",
"OS": "Linux",
"admin": "azureuser"
},
{
"Name": "WinTest",
"OS": "Windows",
"admin": "winadmin"
}
]
I kombination med --output table utdataformatet matchar kolumnnamnen värdet displayKey för hashen för flerval:
az vm list -g 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
Anteckning
Vissa nycklar filtreras bort och skrivs inte ut i tabellvyn. De här nycklarna är id, type och etag. Om du vill se dessa värden kan du ändra nyckelnamnet i en flervalshashar.
az vm show -g QueryDemo -n TestVM --query "{objectID:id}" -o table
Alla matriser kan plattas ut, inte bara resultatet på den översta nivån som returneras av kommandot. I det sista avsnittet användes uttrycket osProfile.linuxConfiguration.ssh.publicKeys[0].keyData för att hämta den offentliga SSH-nyckeln för inloggning. För att hämta varje offentlig SSH-nyckel kan uttrycket i stället skrivas som osProfile.linuxConfiguration.ssh.publicKeys[].keyData .
Det här frågeuttrycket osProfile.linuxConfiguration.ssh.publicKeys plattar ut matrisen och kör keyData sedan uttrycket på varje element:
az vm show -g QueryDemo -n TestVM --query '{VMName:name, admin:osProfile.adminUsername, sshKeys:osProfile.linuxConfiguration.ssh.publicKeys[].keyData }' -o json
{
"VMName": "TestVM",
"admin": "azureuser",
"sshKeys": [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso\n"
]
}
Filtrera matriser
Den andra åtgärden som används för att hämta data från en matris är att filtrera. Filtreringen görs med [?...] JMESPath-operatorn.
Den här operatorn tar ett predikat som innehåll. Ett predikat är en -instruktion som kan utvärderas till antingen true eller false . Uttryck där predikatet utvärderas till true ingår i utdata.
JMESPath erbjuder standardjämförelseoperatorer och logiska operatorer. Dessa inkluderar < , , , , och <= > >= == != .
JMESPath stöder också logiska och ( && ), eller ( ), och inte ( || ! ). Uttryck kan grupperas inom parentes, vilket möjliggör mer komplexa predikatuttryck. Fullständig information om predikat och logiska åtgärder finns i JMESPath-specifikationen.
I det sista avsnittet plattade vi ut en matris för att få en fullständig lista över alla virtuella datorer i en resursgrupp. Med hjälp av filter kan dessa utdata begränsas till endast virtuella Linux-datorer:
az vm list -g QueryDemo --query "[?storageProfile.osDisk.osType=='Linux'].{Name:name, admin:osProfile.adminUsername}" --output table
Name Admin
------ ---------
Test-2 sttramer
TestVM azureuser
Viktigt
I JMESPath omges strängar alltid av enkla citattecken ( ' ). Om du använder dubbla citattecken som en del av en sträng i ett filter predikat får du tomma utdata.
JMESPath har också inbyggda funktioner som kan hjälpa till med filtrering. En sådan funktion är ? contains(string, substring) , som kontrollerar om en sträng innehåller en delsträng. Uttryck utvärderas innan du anropar funktionen, så det första argumentet kan vara ett fullständigt JMESPath-uttryck. I nästa exempel hittar vi alla virtuella datorer som använder SSD-lagring för sin OS-disk:
az vm list -g QueryDemo --query "[? contains(storageProfile.osDisk.managedDisk.storageAccountType,'SSD')].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType}" -o json
[
{
"Name": "TestVM",
"Storage": "StandardSSD_LRS"
},
{
"Name": "WinTest",
"Storage": "StandardSSD_LRS"
}
]
Den här frågan är lite lång. Nyckeln storageProfile.osDisk.managedDisk.storageAccountType anges två gånger och anges igen i utdata. Ett sätt att förkorta det är att tillämpa filtret efter utplattning och välja data.
az vm list -g QueryDemo --query "[].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType}[? contains(Storage,'SSD')]" -o json
[
{
"Name": "TestVM",
"Storage": "StandardSSD_LRS"
},
{
"Name": "WinTest",
"Storage": "StandardSSD_LRS"
}
]
För stora matriser kan det gå snabbare att tillämpa filtret innan du väljer data.
En fullständig lista över funktioner finns i JMESPath-specifikationen – Inbyggda funktioner.
Ändra utdata
JMESPath-funktioner har också ett annat syfte, som är att arbeta med resultatet av en fråga. Alla funktioner som returnerar ett icke-booleskt värde ändrar resultatet av ett uttryck.
Du kan till exempel sortera data efter ett egenskapsvärde med sort_by(array, &sort_expression) . JMESPath använder en särskild operator, & , för uttryck som ska utvärderas senare som en del av en funktion. I nästa exempel visas hur du sorterar en VM-lista efter OS-diskstorlek:
az vm list -g QueryDemo --query "sort_by([].{Name:name, Size:storageProfile.osDisk.diskSizeGb}, &Size)" --output table
Name Size
------- ------
TestVM 30
Test-2 32
WinTest 127
En fullständig lista över funktioner finns i JMESPath-specifikationen – Inbyggda funktioner.
Experimentera med frågor interaktivt
För att börja experimentera med JMESPath erbjuder JMESPath-terminalens Python-paket en interaktiv miljö för att arbeta med frågor. Data piped som indata och sedan skrivs frågor och körs i redigeraren.
pip install jmespath-terminal
az vm list --output json | jpterm