Partager via


Comment interroger la sortie de commande Azure CLI à l’aide d’une requête JMESPath

Azure CLI utilise le --query paramètre pour exécuter une requête JMESPath sur les résultats des commandes. JMESPath est un langage de requête pour JSON, qui vous permet de sélectionner et de modifier des données depuis une sortie CLI.

Toutes les commandes dans Azure CLI prennent en charge le --query paramètre. Cet article explique comment utiliser les fonctionnalités de JMESPath et fournit des exemples de requêtes. Découvrez les concepts JMESPath utiles pour l’interrogation sous l’onglet Concepts. Consultez des exemples de requêtes JMESPath sous l’onglet Exemples.

Azure CLI utilise des requêtes pour sélectionner et modifier la sortie des commandes Azure CLI. Les requêtes sont exécutées côté client sur l’objet JSON retourné par la commande Azure CLI avant toute mise en forme d’affichage.

Les caractères d’échappement nécessaires dans les requêtes diffèrent pour différents environnements. Il est recommandé d’exécuter des requêtes dans Azure Cloud Shell ou cmd, car ces interpréteurs de commandes nécessitent moins de caractères d’échappement. Pour vous assurer que les exemples de requête sont syntaxiquement corrects, sélectionnez l’onglet de l’interpréteur de commandes que vous utilisez.

Résultats CLI pour le dictionnaire et la liste

Les résultats des commandes CLI sont d’abord traités comme JSON pour les requêtes, même lorsque le format de sortie est autre que JSON. Les résultats de l’interface CLI sont soit un tableau JSON, soit un dictionnaire. Les tableaux sont des séquences d’objets qui peuvent être indexés, et les dictionnaires sont des objets non ordonnés accessibles avec des clés.

Voici un exemple de tableau :

[ 
  1,
  2,
  3
]

Voici un exemple de dictionnaire :

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

Les commandes qui peuvent retourner plusieurs objets retournent un tableau et les commandes qui retournent toujoursun seul objet retournent un dictionnaire.

Obtenir des propriétés dans un dictionnaire

En utilisant les résultats du dictionnaire, vous pouvez accéder aux propriétés du niveau supérieur avec uniquement la clé. Le . caractère (sous-expression) est utilisé pour accéder aux propriétés des dictionnaires imbriqués. Avant d’introduire des requêtes, examinez la sortie non modifiée de la commande az vm show :

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

La commande génère un dictionnaire. Certains contenus ont été omis.

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

La commande suivante obtient les clés publiques SSH autorisées à se connecter à la machine virtuelle en ajoutant une requête :

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

Les chaînes de requête respectent la casse. Par exemple, la modification de « osProfile » en « OsProfile » dans la requête précédente ne retourne pas les résultats corrects.

Obtenir plusieurs valeurs

Pour obtenir plusieurs propriétés, placez les expressions séparées par des virgules entre crochets [ ] (une liste à sélection multiple). La commande suivante obtient le nom de la machine virtuelle, l’utilisateur administrateur et la clé SSH en même temps :

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

Ces valeurs sont répertoriées dans le tableau de résultats dans l’ordre dans lequel elles ont été données dans la requête. Étant donné que le résultat est un tableau, il n’existe aucune clé associée aux résultats. Pour obtenir un dictionnaire au lieu d’un tableau, consultez la section suivante.

Renommer des propriétés dans une requête

Pour obtenir un dictionnaire au lieu d’un tableau lors de l’interrogation de plusieurs valeurs, utilisez l’opérateur { } (hachage multiselect). Le format d’un hachage à sélection multiple est {displayName:JMESPathExpression, ...}. displayName est la chaîne affichée dans la sortie et JMESPathExpression est l’expression JMESPath à évaluer. Modifiez l’exemple de la dernière section en transformant la liste à sélection multiple en hachage.

Remarque

Si vous choisissez d’utiliser un espace dans un nouveau nom de colonne, comme VM name au lieu de VMName, les règles de citation changent à la fois dans Bash et PowerShell. Pour obtenir des exemples, consultez Passer des espaces dans les paramètres Azure CLI .

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

Obtenir des propriétés dans un tableau

Un tableau n’a pas de propriétés propres, mais il peut être indexé. Cette fonctionnalité est illustrée dans le dernier exemple avec l’expression publicKeys[0], qui obtient le premier élément du publicKeys tableau. Il n’existe aucune garantie que la sortie de l’interface CLI est ordonnée. Évitez donc d’utiliser l’indexation, sauf si vous êtes sûr de l’ordre ou que vous ne vous souciez pas de l’élément que vous obtenez. Pour accéder aux propriétés des éléments d’un tableau, vous effectuez l’une des deux opérations suivantes : aplatir ou filtrer. Cette section explique comment aplatir un tableau.

L’aplatissement d’un tableau est effectué avec l’opérateur [] JMESPath. Toutes les expressions après l’opérateur [] sont appliquées à chaque élément du tableau actuel. Si [] apparaît au début d'une requête, il aplatit le résultat de commande CLI. Les résultats de az vm list peuvent être inspectés avec cette fonctionnalité. La requête suivante obtient le nom, le système d’exploitation et le nom d’administrateur pour chaque machine virtuelle dans un groupe de ressources :

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

N’importe quel tableau peut être aplatit, pas seulement le résultat de niveau supérieur retourné par la commande. Dans la dernière section, l’expression osProfile.linuxConfiguration.ssh.publicKeys[0].keyData a été utilisée pour obtenir la clé publique SSH pour la connexion. Pour obtenir chaque clé publique SSH, l’expression peut plutôt être écrite en tant que osProfile.linuxConfiguration.ssh.publicKeys[].keyData. Cette expression de requête aplatit le osProfile.linuxConfiguration.ssh.publicKeys tableau, puis exécute l’expression keyData sur chaque élément :

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

Filtrer des tableaux avec des expressions booléennes

L’autre opération utilisée pour obtenir des données à partir d’un tableau est filtrage. Le filtrage est effectué avec l’opérateur [?...] JMESPath. Cet opérateur prend un prédicat comme contenu. Un prédicat est n’importe quelle instruction (y compris les propriétés booléennes) qui peut être évaluée à true ou false. Les expressions dans lesquelles le prédicat est évalué à true sont incluses dans la sortie.

La première requête montre comment répertorier les noms de tous les abonnements Azure connectés à votre compte dont isDefault la propriété est vraie. Les deuxième et troisième requêtes montrent deux façons différentes de répertorier tous les abonnements dont isDefault la propriété est false.

# 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 offre les opérateurs logiques et de comparaison standard. Ceux-ci incluent <, , <=>, >=, ==et !=. JMESPath prend également en charge les fonctions logiques et (&&ou (||) et non (!). Les expressions peuvent être regroupées entre parenthèses, ce qui permet d’obtenir des expressions de prédicat plus complexes. Pour plus d’informations sur les prédicats et les opérations logiques, consultez la spécification JMESPath.

Dans la dernière section, vous avez aplatit un tableau pour obtenir la liste complète de toutes les machines virtuelles d’un groupe de ressources. Avec l’utilisation de filtres, cette sortie peut être limitée aux machines virtuelles Linux uniquement :

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

Vous pouvez également filtrer des valeurs numériques telles que la taille du disque du système d’exploitation. L’exemple suivant montre comment filtrer la liste des machines virtuelles pour les afficher avec une taille de disque supérieure ou égale à 50 Go.

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

Pour les grands tableaux, il peut être plus rapide d’appliquer le filtre avant de sélectionner des données.

Important

Dans JMESPath, les chaînes sont toujours entourées de guillemets simples (') ou de caractères d’échappement (`). Si vous utilisez des guillemets doubles dans une chaîne dans un prédicat de filtre, vous obtiendrez une sortie vide.

Fonctions JMESPath

JMESPath dispose également de fonctions intégrées qui permettent des requêtes plus complexes et de modifier la sortie de requête. Cette section se concentre sur l’utilisation des fonctions JMESPath pour créer des requêtes pendant que la section Manipulation de la sortie avec fonctions montre comment utiliser des fonctions pour modifier la sortie.

Les expressions sont évaluées avant d’appeler la fonction, de sorte que les arguments eux-mêmes peuvent être des expressions JMESPath. Les exemples suivants illustrent ce concept à l’aide contains(string, substring)de , qui vérifie si une chaîne contient une sous-chaîne. Cette commande recherche toutes les machines virtuelles utilisant le stockage SSD pour leur disque de système d’exploitation :

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

Expressions de tube

Semblable à l'utilisation de | dans la ligne de commande, | peut être utilisé dans les requêtes JMESPath pour appliquer des expressions aux résultats intermédiaires des requêtes. Nous pouvons également utiliser | pour décomposer des requêtes complexes en sous-expressions plus simples. Pour raccourcir la requête de la section précédente, utilisez | pour appliquer le filtre après la mise à plat et la sélection des données.

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

Consultez la spécification JMESPath - Fonctions intégrées pour obtenir la liste complète des fonctions.

Manipulation de la sortie avec des fonctions

Les fonctions JMESPath ont également un autre objectif, qui consiste à fonctionner sur les résultats d’une requête. Toute fonction qui retourne une valeur nonboolean modifie le résultat d’une expression. Par exemple, vous pouvez trier les données par une valeur de propriété avec sort_by(array, &sort_expression). JMESPath utilise un opérateur spécial, &pour les expressions qui doivent être évaluées ultérieurement dans le cadre d’une fonction. L’exemple suivant montre comment trier une liste de machines virtuelles par taille de disque du système d’exploitation :

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

Consultez la spécification JMESPath - Fonctions intégrées pour obtenir la liste complète des fonctions.

Mise en forme des résultats de la requête

Azure CLI utilise JSON comme format de sortie par défaut, mais différents formats de sortie peuvent mieux correspondre à une requête en fonction de son objectif et de ses résultats. Les requêtes sont toujours exécutées sur la JSON sortie, puis mises en forme.

Cette section examinera le format tsv et le format table ainsi que quelques cas d'utilisation pour chaque format. Pour plus d’informations sur les formats de sortie, consultez Formats de sortie pour les commandes Azure CLI.

Format de sortie TSV

Le format de sortie tsv retourne des valeurs séparées par des tabulations et des sauts de ligne sans mise en forme, clés ou autres symboles supplémentaires. Ce format est utile lorsque la sortie est stockée dans un paramètre et utilisée dans une autre commande.

Un cas d’usage pour tsv la mise en forme est les requêtes qui récupèrent une valeur à partir d’une commande CLI, telle qu’un ID de ressource Azure ou un nom de ressource, et stockent la valeur dans une variable d’environnement locale. Par défaut, les résultats sont retournés au format JSON, ce qui peut être un problème lors du traitement des chaînes JSON placées entre " des caractères. Les guillemets peuvent ne pas être interprétés par l’interpréteur de commandes si la sortie de commande est directement affectée à la variable d’environnement. Ce problème est visible dans l’exemple suivant qui affecte un résultat de requête à une variable d’environnement :

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

Utilisez le formatage tsv, comme illustré dans la requête suivante, pour empêcher d'encapsuler les valeurs de retour avec des informations de type :

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

Format de sortie du tableau

Le format table imprime la sortie sous forme de tableau ASCII, ce qui la rend facile à lire et à analyser. Tous les champs ne sont pas inclus dans le tableau afin que ce format soit mieux utilisé comme vue d’ensemble des données pouvant faire l’objet d’une recherche humaine. Les champs qui ne sont pas inclus dans la table peuvent toujours être filtrés dans le cadre d’une requête.

Remarque

Certaines clés sont filtrées et non imprimées dans l’affichage tableau. Ces clés sont id, typeet etag. Pour afficher ces valeurs, vous pouvez modifier le nom de clé dans un hachage à sélection multiple.

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

Nous pouvons utiliser une requête précédente pour illustrer ce concept. La requête d’origine a retourné un objet JSON contenant le nom, le système d’exploitation et le nom d’administrateur pour chaque machine virtuelle du groupe de ressources :

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

Lorsqu’ils sont combinés au --output table format de sortie, les noms de colonnes correspondent à la displayKey valeur du hachage de sélection multiple, ce qui facilite la consultation des informations.

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

Étapes suivantes

Pour en savoir plus sur les requêtes JMESPath, consultez le didacticiel JMESPath.

Pour en savoir plus sur les autres concepts d’Azure CLI mentionnés dans cet article, consultez :