Abfragen einer Azure CLI-Befehlsausgabe mithilfe einer JMESPath-Abfrage

Die Azure CLI verwendet der Parameter --query, um eine JMESPath-Abfrage für die Ergebnisse von Befehlen auszuführen. JMESPath ist eine Abfragesprache für JSON, die es ermöglicht, Daten aus der CLI-Ausgabe auszuwählen und zu ändern.

Alle Befehle in der Azure CLI unterstützen den --query Parameter. In diesem Artikel wird erläutert, wie Sie die Features von JMESPath verwenden und Beispiele für Abfragen bereitstellen. Erfahren Sie mehr über JMESPath-Konzepte, die für die Abfrage auf der Registerkarte „Konzepte“ nützlich sind. Siehe Beispiele für JMESPath-Abfragen unter der Registerkarte „Beispiele“.

Azure CLI verwendet Abfragen, um die Ausgabe von Azure CLI-Befehlen auszuwählen und zu ändern. Abfragen werden clientseitig auf dem zurückgegebenen JSON-Objekt des Azure CLI-Befehls vor jeder Anzeigeformatierung ausgeführt.

Die in Abfragen benötigten Escapezeichen unterscheiden sich für verschiedene Umgebungen. Es wird empfohlen, Abfragen in Azure Cloud Shell oder cmd auszuführen, da diese Shells weniger Escapezeichen erfordern. Um sicherzustellen, dass die Abfragebeispiele syntaktisch korrekt sind, wählen Sie die Registerkarte für die verwendete Shell aus.

CLI-Ergebnisse im Wörterbuch- und Listenformat

Selbst wenn Sie ein anderes Ausgabeformat als JSON verwenden, werden die Ergebnisse von CLI-Befehlen für Abfragen zunächst als JSON-Ausgabe behandelt. CLI-Ergebnisse werden in Form eines JSON-Arrays oder -Wörterbuchs zurückgegeben. Arrays sind Sequenzen von Objekten, die indiziert werden können, und Wörterbücher sind unsortierte Objekte, auf die mit Schlüsseln zugegriffen wird.

Dies ist ein Beispiel für ein Array:

[ 
  1,
  2,
  3
]

Dies ist ein Beispiel für ein Wörterbuch:

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

Befehle, die mehr als ein Objekt zurückgeben können, geben ein Array zurück, und Befehle, die immernur ein einzelnes Objekt zurückgeben, geben ein Wörterbuch zurück.

Abrufen von Eigenschaften in einem Wörterbuch

Bei der Arbeit mit Ergebnissen im Wörterbuchformat können Sie auf Eigenschaften der obersten Ebene nur mit dem Schlüssel zugreifen. Das Zeichen . (Teilausdruck) wird verwendet, um auf Eigenschaften von geschachtelten Wörterbüchern zuzugreifen. Bevor wir uns mit Abfragen befassen, werfen wir einen Blick auf die unveränderte Ausgabe des Befehls az vm show:

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

Der Befehl gibt ein Wörterbuch zurück. Teile des Inhalts wurden hier weggelassen.

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

Der folgende Befehl ruft durch Hinzufügen einer Abfrage die öffentlichen SSH-Schlüssel ab, die zum Herstellen einer Verbindung mit der VM autorisiert sind:

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

Bei Abfragezeichenfolgen muss die Groß-/Kleinschreibung beachtet werden. Wenn Sie beispielsweise „osProfile“ in „OsProfile“ in der obigen Abfrage ändern, werden nicht die richtigen Ergebnisse zurückgegeben.

Abrufen mehrerer Werte

Um mehrere Eigenschaften abzurufen, schließen Sie Ausdrücke durch Kommata getrennt in eckige Klammern [ ] (eine Mehrfachauswahlliste) ein. Der folgende Befehl ruft den VM-Namen, den Administratorbenutzer und den SSH-Schlüssel gleichzeitig ab:

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

Diese Werte werden im Ergebnisarray in der Reihenfolge aufgeführt, in der sie in der Abfrage übergeben wurden. Da das Ergebnis ein Array ist, sind keine Schlüssel mit den Ergebnissen verknüpft. Informationen zum Abrufen eines Wörterbuchs anstelle eines Arrays finden Sie im folgenden Abschnitt.

Umbenennen von Eigenschaften in einer Abfrage

Um beim Abfragen mehrerer Werte ein Wörterbuch anstelle eines Arrays abzurufen, verwenden Sie den Operator { } (Mehrfachauswahl-Hash). Das Format für einen Mehrfachauswahl-Hash ist {displayName:JMESPathExpression, ...}. displayName ist die in der Ausgabe angezeigte Zeichenfolge, und JMESPathExpression ist der JMESPath-Ausdruck, der ausgewertet werden soll. Ändern Sie das Beispiel aus dem letzten Abschnitt, indem Sie die Mehrfachauswahlliste in einen Hash ändern:

Hinweis

Wenn Sie ein Leerzeichen in einem neuen Spaltennamen verwenden möchten, z VM name . B. anstelle von VMName, ändern sich die Quotingregeln sowohl in Bash als auch in PowerShell. Beispiele finden Sie unter Pass spaces in Azure CLI-Parametern .

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

Abrufen von Eigenschaften in einem Array

Ein Array verfügt nicht über eigene Eigenschaften, kann aber indiziert werden. Dieses Feature wird im letzten Beispiel mit dem Ausdruck publicKeys[0] veranschaulicht, der das erste Element des publicKeys-Arrays abruft. Es gibt keine Garantie, dass die CLI-Ausgabe sortiert ist. Sie sollten daher die Indizierung nur dann verwenden, wenn Sie die Reihenfolge kennen oder das zurückgegebene Element für Sie nicht von Bedeutung ist. Um auf die Eigenschaften von Elementen in einem Array zuzugreifen, führen Sie einen von zwei Vorgängen aus: Vereinfachen oder Filtern. In diesem Abschnitt wird beschrieben, wie ein Array vereinfacht wird.

Zum Vereinfachen eines Arrays wird der JMESPath-Operator [] verwendet. Alle Ausdrücke nach dem []-Operator werden auf jedes Element im aktuellen Array angewendet. Wenn [] am Anfang der Abfrage steht, wird das Ergebnis des CLI-Befehls vereinfacht. Die Ergebnisse von az vm list können mit diesem Feature überprüft werden. Mit der folgenden Abfrage werden der Name, das Betriebssystem und der Administratorname für jede VM in einer Ressourcengruppe abgerufen:

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

Jedes Array kann vereinfacht werden, nicht nur das vom Befehl zurückgegebene Ergebnis der obersten Ebene. Im letzten Abschnitt wurde der Ausdruck osProfile.linuxConfiguration.ssh.publicKeys[0].keyData verwendet, um den öffentlichen SSH-Schlüssel für die Anmeldung abzurufen. Zum Abrufen aller öffentlichen SSH-Schlüssel könnte der Ausdruck stattdessen als osProfile.linuxConfiguration.ssh.publicKeys[].keyData geschrieben werden. Dieser Abfrageausdruck vereinfacht das Array osProfile.linuxConfiguration.ssh.publicKeys und führt dann den Ausdruck keyData für jedes Element aus:

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

Filtern von Arrays mit booleschen Ausdrücken

Der zweite Vorgang zum Abrufen von Daten aus einem Array ist das Filtern. Zum Filtern wird der JMESPath-Operator [?...] verwendet. Dieser Operator akzeptiert ein Prädikat als Inhalt. Ein Prädikat ist eine beliebige Anweisung, einschließlich booleschen Eigenschaften, die zu true oder false ausgewertet werden kann. Ausdrücke, bei denen das Prädikat zu true ausgewertet wird, sind in der Ausgabe enthalten.

In der ersten Abfrage wird veranschaulicht, wie die Namen aller Azure-Abonnements aufgelistet werden, die mit Ihrem Konto verbunden sind, dessen Eigenschaft isDefault wahr ist. Die zweiten und dritten Abfragen zeigen zwei verschiedene Möglichkeiten zum Auflisten aller Abonnements, deren Eigenschaft isDefault falsch ist.

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

JMESPath bietet die standardmäßigen Vergleichsoperatoren und logischen Operatoren. Dazu zählen <, <=, >, >=, == und !=. JMESPath unterstützt auch logisches AND (&&), OR (||) und NOT (!). Ausdrücke können zum Erstellen komplexerer Prädikatausdrücke in Klammern gruppiert werden. Ausführliche Informationen zu Prädikaten und logischen Vorgängen finden Sie in der JMESPath-Spezifikation.

Im letzten Abschnitt haben Sie ein Array vereinfacht, um die vollständige Liste aller VMs in einer Ressourcengruppe abzurufen. Mithilfe von Filtern kann diese Ausgabe auf Linux-VMs beschränkt werden:

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

Sie können auch numerische Werte wie die Betriebssystemdatenträgergröße filtern. Im folgenden Beispiel wird veranschaulicht, wie Sie die Liste der VMs filtern, um die VMs mit einer Datenträgergröße größer als oder gleich 50 GB anzuzeigen.

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

Bei großen Arrays lässt sich der Vorgang möglicherweise beschleunigen, indem der Filter vor der Auswahl von Daten angewendet wird.

Wichtig

In JMESPath werden Zeichenfolgen immer in einfache Anführungszeichen (') oder Escapezeichen (`) gesetzt. Wenn Sie in einem Filterprädikat doppelte Anführungszeichen innerhalb einer Zeichenfolge verwenden, ist die Ausgabe leer.

JMESPath-Funktionen

JMESPath verfügt auch über integrierte Funktionen, die komplexere Abfragen ermöglichen und die Abfrageausgabe ändern können. Dieser Abschnitt konzentriert sich auf die Verwendung von JMESPath-Funktionen zum Erstellen von Abfragen, während der Abschnitt Manipulieren von Ausgaben mit Funktionen veranschaulicht, wie Funktionen zum Ändern der Ausgabe verwendet werden.

Ausdrücke werden vor dem Aufruf der Funktion ausgewertet, so dass die Argumente selbst JMESPath-Ausdrücke sein können. In den folgenden Beispielen wird dies mithilfe von contains(string, substring) veranschaulicht, womit überprüft wird, ob eine Zeichenfolge eine Unterzeichenfolge (substring) enthält. Dieser Befehl ruft alle VMs mit SSD-Speicher für den Betriebssystemdatenträger ab:

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

Pipe-Ausdrücke

Ähnlich wie | in der Befehlszeile verwendet wird, kann | in JMESPath-Abfragen verwendet werden, um Ausdrücke auf Zwischenabfrageergebnisse anzuwenden. Wir können auch | verwenden, um komplexe Abfragen in einfachere Teilausdrücke aufzuteilen. Um die Abfrage aus dem vorherigen Abschnitt zu kürzen, verwenden Sie |, um den Filter nach der Vereinfachung und Auswahl von Daten anzuwenden.

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

Die vollständige Liste der Funktionen finden Sie in der JMESPath-Spezifikation unter Built-in Functions (Integrierte Funktionen).

Bearbeiten der Ausgabe mit Funktionen

JMESPath-Funktionen haben zudem einen weiteren Zweck: das Bearbeiten bzw. Ändern der Ergebnisse einer Abfrage. Jede Funktion, die einen nicht booleschen Wert zurückgibt, ändert das Ergebnis eines Ausdrucks. Mit sort_by(array, &sort_expression) können Sie Daten beispielsweise nach einem Eigenschaftswert sortieren. JMESPath verwendet einen speziellen Operator (&) für Ausdrücke, die später im Rahmen einer Funktion ausgewertet werden sollen. Das nächste Beispiel zeigt, wie Sie eine VM-Liste nach der Größe des Betriebssystemdatenträgers sortieren:

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

Die vollständige Liste der Funktionen finden Sie in der JMESPath-Spezifikation unter Built-in Functions (Integrierte Funktionen).

Formatieren von Abfrageergebnissen

Die Azure CLI verwendet JSON als Standardausgabeformat, unterschiedliche Ausgabeformate können jedoch je nach Zweck und Ergebnissen einer Abfrage besser geeignet sein. Abfragen werden immer zuerst auf der Ausgabe JSON ausgeführt und dann formatiert.

Dieser Abschnitt wird die Formatierung tsv und table und einige Anwendungsfälle für jedes Format behandeln. Weitere Informationen zu Ausgabeformaten finden Sie unter Ausgabeformate für Azure CLI-Befehle.

TSV-Ausgabeformat

Das tsv-Ausgabeformat gibt durch Tabstopp oder Zeilenumbruch getrennte Werte ohne zusätzliche Formatierung, Schlüssel oder andere Symbole zurück. Dieses Format ist nützlich, wenn die Ausgabe in einem Parameter gespeichert und in einem anderen Befehl verwendet wird.

Ein Anwendungsfall für die Formatierung tsv sind Abfragen, die einen Wert aus einem CLI-Befehl abrufen, z. B. eine Azure-Ressourcen-ID oder einen Ressourcennamen, und den Wert in einer lokalen Umgebungsvariable speichern. Standardmäßig werden die Ergebnisse im JSON-Format zurückgegeben. Dies kann ein Problem beim Umgang mit JSON-Zeichenfolgen sein, die in "-Zeichen eingeschlossen sind. Die Quoten werden möglicherweise nicht von der Shell interpretiert, wenn die Befehlsausgabe direkt der Umgebungsvariable zugewiesen wird. Dieses Problem wird im folgenden Beispiel veranschaulicht, in dem ein Abfrageergebnis einer Umgebungsvariable zugewiesen wird:

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

Verwenden Sie tsv-Formatierungen, wie in der folgenden Abfrage gezeigt, um zu verhindern, dass Rückgabewerte in Typinformationen eingeschlossen werden:

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

Tabellenausgabeformat

Beim table-Format wird die Ausgabe als ASCII-Tabelle zurückgegeben, die einfach gelesen und überprüft werden kann. Da nicht alle Felder in der Tabelle enthalten sind, eignet sich dieses Format am besten für eine vom Menschen durchsuchbare Übersicht der Daten. Felder, die nicht in der Tabelle enthalten sind, können dennoch im Rahmen einer Abfrage gefiltert werden.

Hinweis

Bestimmte Schlüssel werden herausgefiltert und nicht in der Tabellenansicht gedruckt. Diese Schlüssel sind id, type und etag. Um diese Werte anzuzeigen, können Sie den Schlüsselnamen in einem Mehrfachauswahl-Hash ändern.

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

Wir können eine vorherige Abfrage verwenden, um dies zu veranschaulichen. Die ursprüngliche Abfrage gibt ein JSON-Objekt zurück, das den Namen, das Betriebssystem und den Administratornamen für jede VM in der Ressourcengruppe enthält:

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

Wird diese Abfrage mit dem Ausgabeformat --output table kombiniert, entsprechen die Spaltennamen dem displayKey-Wert des Mehrfachauswahl-Hashes, wodurch es leichter wird, die Informationen zu überfliegen:

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

Nächste Schritte

Weitere Informationen zu JMESPath-Abfragen finden Sie im JMESPath-Lernprogramm.

Weitere Informationen zu anderen in diesem Artikel erwähnten Azure CLI-Konzepten finden Sie unter: