Dotazování výstupu příkazu Azure CLI pomocí dotazu JMESPath

Azure CLI pomocí argumentu --query provádí dotazy JMESPath nad výsledky příkazů. JMESPath je dotazovací jazyk pro JSON, který vám dává možnost vybírat a upravovat data z výstupu rozhraní příkazového řádku. Dotazy jsou spouštěny ve výstupu JSON před jakýmkoli formátováním zobrazení.

Argument --query podporují všechny příkazy v rozhraní příkazového řádku Azure. Tento článek popisuje, jak používat funkce JMESPath s řadou malých, jednoduchých příkladů.

Poznámka

při použití rozhraní příkazového řádku Azure CLI v prostředí PowerShell v Windows může být pro argument dotazu potřeba některé další uvozovací znaky. Další podrobnosti najdete v tématu věnovaném problémům s prostředím PowerShell .

Výsledky CLI slovníku a seznamu

I v případě, že používáte výstupní formát jiný než JSON, výsledky příkazu rozhraní příkazového řádku se nejprve považují za JSON pro dotazy. Výsledky rozhraní příkazového řádku jsou buď pole JSON, nebo slovník. Pole jsou sekvence objektů, které lze indexovat, a slovníky jsou neuspořádané objekty, ke kterým se používají klíče. Příkazy, které by mohly vracet více než jeden objekt, vrátí pole a příkazy, které vždy vrátí pouze jeden objekt, vrátí slovník.

Získání vlastností ve slovníku

Při práci s výsledky slovníku můžete získat přístup k vlastnostem z nejvyšší úrovně pouze pomocí klíče. .Znak (dílčí výraz) se používá pro přístup k vlastnostem vnořených slovníků. Před představením dotazů se podívejte na neupravený výstup az vm show příkazu:

az vm show -g QueryDemo -n TestVM -o json

Příkaz zobrazí výstup slovníku. Byl vynechán nějaký obsah.

{
  "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
  },
  ....
}

Následující příkaz získá veřejné klíče SSH autorizované pro připojení k virtuálnímu počítači přidáním dotazu:

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"
  }
]

Získat jednu hodnotu

Běžným případem je, že je potřeba, abyste z příkazu CLI získali jenom jednu hodnotu, jako je ID prostředku Azure, název prostředku, uživatelské jméno nebo heslo. V takovém případě často chcete uložit hodnotu do místní proměnné prostředí. Chcete-li získat jedinou vlastnost, nejprve se ujistěte, že jste z dotazu obdrželi pouze jednu vlastnost. Změna posledního příkladu pro získání pouze uživatelského jména správce:

az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o json
"azureuser"

To vypadá jako platná jediná hodnota, ale Všimněte si, že " jsou znaky vráceny jako součást výstupu. To značí, že objekt je řetězec formátu JSON. Je důležité si uvědomit, že pokud tuto hodnotu přiřadíte přímo jako výstup příkazu do proměnné prostředí, uvozovky nemusí být interpretovány pomocí prostředí:

USER=$(az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o json)
echo $USER
"azureuser"

To je téměř jistě, co byste chtěli. V takovém případě chcete použít výstupní formát, který neobklopuje vrácené hodnoty s informacemi o typu. Nejlepší možnost výstupu, kterou CLI nabízí pro tento účel, je tsv hodnoty oddělené tabulátorem. Zejména při načítání hodnoty, která je pouze jednou hodnotou (ne slovníku nebo seznamu), tsv je zaručeno, že výstup bude bez uvozovek.

az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o tsv
azureuser

Další informace o tsv formátu výstupu najdete v tématu formáty výstupu – výstupní formát TSV .

Dotaz na logické hodnoty

Dotazování logických hodnot se mírně liší. Existují dvě možnosti:

# 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\`]"

Získat více hodnot

Chcete-li získat více než jednu vlastnost, vložte výrazy do hranatých závorek [ ] (seznam s více výběry) jako seznam oddělený čárkami. K získání názvu virtuálního počítače, uživatele s oprávněními správce a klíče SSH najednou použijte příkaz:

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"
]

Tyto hodnoty jsou uvedeny v poli výsledek v pořadí, v jakém byly uvedeny v dotazu. Vzhledem k tomu, že výsledkem je pole, nejsou k výsledkům přidruženy žádné klíče.

Přejmenování vlastností v dotazu

Chcete-li získat slovník místo pole při dotazování na více hodnot, použijte { } operátor (hash vícenásobného výběru). Formát pro algoritmus hash s více výběry je {displayName:JMESPathExpression, ...} . displayName bude řetězec zobrazený ve výstupu a JMESPathExpression je výraz JMESPath, který se má vyhodnotit. Úprava příkladu z poslední sekce změnou seznamu s více výběry na hodnotu 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"
}

Získání vlastností v poli

Pole nemá žádné vlastní vlastnosti, ale může být indexováno. Tato funkce je zobrazena v posledním příkladu s výrazem publicKeys[0] , který získá první prvek publicKeys pole. Není k dispozici žádný druh výstupu rozhraní příkazového řádku, takže indexování nepoužívejte, pokud si nejste jistí nebo nezáleží na tom, jaký prvek získáte. Chcete-li získat přístup k vlastnostem prvků v poli, proveďte jednu ze dvou operací: sloučení a filtrování. Tato část popisuje, jak sloučit pole.

Sloučení pole se provádí pomocí [] operátoru JMESPath. Všechny výrazy za [] operátorem jsou aplikovány na každý prvek v aktuálním poli. Pokud [] se zobrazí na začátku dotazu, sloučí výsledek příkazu rozhraní příkazového řádku. Výsledky je az vm list možné zkontrolovat pomocí této funkce. Chcete-li získat název, operační systém a jméno správce pro každý virtuální počítač ve skupině prostředků:

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"
  }
]

V kombinaci s --output table formátem výstupu se názvy sloupců shodují s displayKey hodnotou hodnoty hash s více výběry:

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

Poznámka

Některé klíče se odfiltrují a v zobrazení tabulky se nevytisknou. Jde o klíče id, type a etag. Chcete-li zobrazit tyto hodnoty, můžete změnit název klíče v hodnotě hash s více výběry.

az vm show -g QueryDemo -n TestVM --query "{objectID:id}" -o table

Jakékoli pole může být shrnuto, nikoli pouze výsledek nejvyšší úrovně vrácený příkazem. V poslední části osProfile.linuxConfiguration.ssh.publicKeys[0].keyData byl výraz použit k získání veřejného klíče SSH pro přihlášení. Pro získání každého veřejného klíče SSH by se výraz mohl zapsat jako osProfile.linuxConfiguration.ssh.publicKeys[].keyData . Tento výraz dotazu sloučí osProfile.linuxConfiguration.ssh.publicKeys pole a potom spustí keyData výraz u každého prvku:

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"
  ]
}

Filtrovat pole

Druhá operace, která se používá k získání dat z pole, je filtrování. Filtrování se provádí pomocí [?...] operátoru JMESPath. Tento operátor přijímá jako svůj obsah predikát. Predikát je jakýkoli příkaz, který lze vyhodnotit buď true nebo false . Výrazy, na které se predikát vyhodnocuje, true jsou zahrnuté ve výstupu.

JMESPath nabízí standardní porovnání a logické operátory. Mezi ně patří,,,, < <= > >= == a != . JMESPath také podporuje logický operátor and ( && ), or () || a NOT ( ! ). Výrazy mohou být seskupeny do závorek a umožňují tak složitější výrazy predikátů. Úplné informace o predikátech a logických operacích naleznete v tématu JMESPath Specification.

V poslední části jsme vyrovni pole, ve kterém získáte úplný seznam všech virtuálních počítačů ve skupině prostředků. Pomocí filtrů můžete tento výstup omezit jenom na virtuální počítače se systémem Linux:

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

Důležité

V JMESPath jsou řetězce vždy obklopeny jednoduchými uvozovkami ( ' ). Pokud používáte dvojité uvozovky jako součást řetězce v predikátu filtru, získáte prázdný výstup.

JMESPath také obsahuje integrované funkce, které vám pomůžou s filtrováním. Jedna taková funkce je ? contains(string, substring) , která kontroluje, zda řetězec obsahuje podřetězec. Výrazy jsou vyhodnocovány před voláním funkce, takže první argument může být úplný výraz JMESPath. Následující příklad vyhledá všechny virtuální počítače, které používají úložiště SSD pro svůj disk s operačním systémem:

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"
  }
]

Tento dotaz je trochu dlouhý. storageProfile.osDisk.managedDisk.storageAccountTypeKlíč je zmíněn dvakrát a ve výstupu se přechází. Jedním ze způsobů, jak zkrátit, je použít filtr po sloučení a výběru dat.

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"
  }
]

U velkých polí může být rychlejší použít filtr před výběrem dat.

Úplný seznam funkcí najdete v tématu integrované funkce JMESPath Specification .

Změnit výstup

Funkce JMESPath mají také jiný účel, který má působit na výsledky dotazu. Každá funkce, která vrací nelogickou hodnotu, změní výsledek výrazu. Data můžete například seřadit podle hodnoty vlastnosti pomocí sort_by(array, &sort_expression) . JMESPath používá speciální operátor, & pro výrazy, které by měly být vyhodnoceny později jako součást funkce. Další příklad ukazuje, jak seřadit seznam virtuálních počítačů podle velikosti disku s operačním systémem:

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

Úplný seznam funkcí najdete v tématu integrované funkce JMESPath Specification .

Interaktivní experimentování s dotazy

Aby bylo možné začít experimentovat s JMESPath, balíček python JMESPath-Terminal nabízí interaktivní prostředí pro práci s dotazy. Data se přesměrují jako vstup do kanálu a pak se v editoru zapisují a spouštějí dotazy.

pip install jmespath-terminal
az vm list --output json | jpterm