Поделиться через


Как запросить выходные данные команды Azure CLI с помощью запроса JMESPath

Azure CLI использует --query параметр для выполнения запроса JMESPath в результатах команд. JMESPath — это язык запросов для JSON, предоставляющий возможность выбирать и изменять данные из выходных данных CLI.

Все команды в Azure CLI поддерживают этот параметр --query. В этой статье описывается, как использовать функции JMESPath и приведены примеры запросов. Узнайте о концепциях JMESPath, которые полезны для запроса на вкладке концепций. Примеры запросов JMESPath см. на вкладке примеров.

Azure CLI использует запросы для выбора и изменения выходных данных команд Azure CLI. Запросы выполняются на стороне клиента в возвращаемом объекте JSON команды Azure CLI до любого форматирования отображения.

Escape-символы, необходимые в запросах, отличаются для разных сред. Рекомендуется выполнять запросы в Azure Cloud Shell или cmd, так как эти оболочки требуют меньше escape-символов. Чтобы убедиться, что примеры запросов синтаксически правильны, выберите вкладку для используемой оболочки.

Результаты CLI для словаря и списка

Результаты команды CLI сначала рассматриваются как JSON для запросов, даже если выходной формат отличается от JSON. Результаты CLI — это массив JSON или словарь. Массивы представляют собой последовательности объектов, которые можно индексировать, а словари являются неупорядоченными объектами, к которым обращаются ключи.

Это пример массива:

[ 
  1,
  2,
  3
]

Это пример словаря:

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

Команды, которые могут возвращать несколько объектов, возвращают массив и команды, которые всегда возвращают только один объект, возвращают словарь.

Получение свойств в словаре

Работа с результатами словаря позволяет получить доступ к свойствам верхнего уровня только с помощью ключа. Символ . (subexpression) используется для доступа к свойствам вложенных словарей. Прежде чем вводить запросы, просмотрите неизмененные выходные данные команды az vm show :

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

Команда выводит словарь. Некоторое содержимое опущено.

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

Следующая команда получает открытые ключи SSH, авторизованные для подключения к виртуальной машине, добавив запрос:

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

Запросы чувствительны к регистру символов. Например, изменение "osProfile" на "OsProfile" в предыдущем запросе не возвращает правильные результаты.

Получение нескольких значений

Чтобы получить несколько свойств, поместите выражения, разделенные запятыми в квадратных скобках (список с несколькими выборками[ ]). Следующая команда получает имя виртуальной машины, пользователя администратора и ключ SSH одновременно:

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

Эти значения перечислены в результирующем массиве в том порядке, в который они были даны в запросе. Так как результат является массивом, ключи, связанные с результатами, отсутствуют. Чтобы получить словарь вместо массива, см. следующий раздел.

Переименование свойств в запросе

Чтобы получить словарь вместо массива при запросе на несколько значений, используйте оператор { }. Формат хэша для множественного выбора - {displayName:JMESPathExpression, ...}. displayName — строка, показанная в выходных данных, и JMESPathExpression является выражением JMESPath для вычисления. Измените пример из последнего раздела, изменив список с несколькими выборками на хэш:

Примечание.

Если вы решили использовать пробел в новом имени столбца, например VM name, вместо VMName, правила цитирования изменяются как в Bash, так и в PowerShell. См. Пропуск пробелов в параметрах 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"
}

Получение свойств в массиве

Массив не имеет собственных свойств, но его можно индексировать. Эта функция показана в последнем примере с выражением publicKeys[0], которое получает первый элемент массива publicKeys . Нет гарантии, что выходные данные CLI упорядочены, поэтому не используйте индексирование, если вы не уверены в порядке или не заботитесь о том, какой элемент вы получаете. Чтобы получить доступ к свойствам элементов в массиве, выполните одну из двух операций: выравнивание или фильтрацию. В этом разделе описывается, как развернуть массив.

Выравнивание массива [] выполняется с помощью оператора JMESPath. Все выражения после оператора [] применяются к каждому элементу в текущем массиве. Если [] появится в начале запроса, он сглаживает результат команды CLI. Результаты az vm list можно проверить с помощью этой функции. Следующий запрос получает имя, ОС и имя администратора для каждой виртуальной машины в группе ресурсов:

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

Любой массив может быть выровнен, а не только результат верхнего уровня, возвращаемый командой. В последнем разделе выражение osProfile.linuxConfiguration.ssh.publicKeys[0].keyData использовалось для получения открытого ключа SSH для входа. Чтобы получить каждый открытый ключ SSH, выражение может быть записано как osProfile.linuxConfiguration.ssh.publicKeys[].keyData. Это выражение запроса сглаживает osProfile.linuxConfiguration.ssh.publicKeys массив, а затем запускает keyData выражение для каждого элемента:

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

Фильтрация массивов посредством логических выражений

Другая операция, используемая для получения данных из массива, — фильтрация. Фильтрация выполняется с помощью оператора JMESPath [?...]. Этот оператор принимает предикат в качестве его содержимого. Предикат — это любая инструкция (включая логические свойства), которую можно оценить либо true либо false. Выражения, в которых предикат вычисляется как true, включаются в выходные данные.

Первый запрос демонстрирует, как получить список имен всех подписок Azure, подключенных к вашей учетной записи, свойство которых isDefault имеет значение true. Второй и третий запросы показывают два разных способа перечисления всех подписок, свойство которых isDefault имеет значение 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 предлагает стандартные операторы сравнения и логические операторы. К ним относятся <, <=, >, >=, == и !=. JMESPath также поддерживает логические операции "и" (&&), "или" (||) и "не" (!). Выражения можно сгруппировать в скобках, что позволяет создавать более сложные выражения предиката. Полные сведения о предикаатах и логических операциях см. в спецификации JMESPath.

В последнем разделе вы развернули массив, чтобы получить полный список всех виртуальных машин в группе ресурсов. При использовании фильтров эти выходные данные могут быть ограничены только виртуальными машинами Linux:

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

Можно также фильтровать числовые значения, такие как размер диска ОС. В следующем примере показано, как отфильтровать список виртуальных машин для отображения с размером диска, превышающим или равным 50 ГБ.

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

Для больших массивов можно быстрее применить фильтр перед выбором данных.

Это важно

В JMESPath строки всегда окружены одними кавычками (') или escape-символами (`). Если в предикате фильтра используются двойные кавычки, вы получите пустые выходные данные.

Функции JMESPath

JMESPath также имеет встроенные функции, позволяющие выполнять более сложные запросы и изменять выходные данные запросов. В этом разделе основное внимание уделяется использованию функций JMESPath для создания запросов во время обработки выходных данных с помощью раздела функций , демонстрирующего использование функций для изменения выходных данных.

Выражения вычисляются перед вызовом функции, поэтому сами аргументы могут быть выражениями JMESPath. В следующих примерах показано это понятие с помощью contains(string, substring)средства проверки того, содержит ли строка подстроку. Эта команда находит все виртуальные машины с хранилищем SSD для своего диска ОС:

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

Выражения пайплайна

Аналогично тому, как | используется в командной строке, | можно использовать в запросах JMESPath для применения выражений к промежуточным результатам запроса. Мы также можем использовать | для разбиения сложных запросов на более простые вложенные выражения. Чтобы сократить запрос из предыдущего раздела, используйте |, чтобы применить фильтр после сглаживания и выбора данных.

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

См. спецификацию JMESPath — встроенные функции для полного списка функций.

Управление выходными данными с помощью функций

Функции JMESPath также имеют другую цель, которая заключается в работе с результатами запроса. Любая функция, возвращающая нелогическое значение, изменяет результат выражения. Например, можно сортировать данные по значению свойства.sort_by(array, &sort_expression) JMESPath использует специальный оператор & для выражений, которые должны быть оценены позже как часть функции. В следующем примере показано, как сортировать список виртуальных машин по размеру диска ОС:

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

См. спецификацию JMESPath — встроенные функции для полного списка функций.

Форматирование результатов запроса

Azure CLI использует JSON в качестве формата выходных данных по умолчанию, однако различные форматы выходных данных лучше подходят для запроса в зависимости от его назначения и результатов. Сначала запросы выполняются на выходных данных JSON, а затем форматируются.

В этом разделе будут рассмотрены форматирование tsv и table, а также некоторые варианты использования для каждого из форматов. Дополнительные сведения о выходных форматах см. в разделе "Выходные форматы" для команд Azure CLI.

Формат выходных данных TSV

Формат tsv выходных данных возвращает значения, разделенные табуляцией и переводом строки, без дополнительного форматирования, ключей или других символов. Этот формат полезен, если выходные данные хранятся в параметре и используются в другой команде.

Одним из вариантов использования форматирования tsv является запросы, которые извлекают значение из команды CLI, например идентификатор ресурса Azure или имя ресурса, и сохраняют значение в локальной переменной среды. По умолчанию результаты возвращаются в формате JSON, что может быть проблемой при работе со строками JSON, которые заключены в " символы. Кавычки могут не интерпретироваться оболочкой, если выходные данные команды назначаются непосредственно переменной среды. Эта проблема рассматривается в следующем примере, который назначает результат запроса переменной среды:

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

Используйте форматирование tsv, как показано в следующем запросе, чтобы избежать обёртывания возвращаемых значений информацией о типе.

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

Формат выходных данных таблицы

Формат table выводит выходные данные в виде таблицы ASCII, что упрощает чтение и сканирование. Не все поля включены в таблицу, поэтому этот формат лучше всего использовать в качестве обзора данных, доступных для поиска человека. Поля, которые не включены в таблицу, по-прежнему можно фильтровать в рамках запроса.

Примечание.

Некоторые ключи отфильтровываются и не печатаются в представлении таблицы. Эти ключи: id, typeи etag. Чтобы просмотреть эти значения, можно изменить имя ключа в хэше с несколькими выборками.

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

Для демонстрации этой концепции можно использовать предыдущий запрос. Исходный запрос вернул объект JSON, содержащий имя, ОС и имя администратора для каждой виртуальной машины в группе ресурсов:

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

В сочетании с --output table форматом выходных данных имена столбцов соответствуют displayKey значению хэша multiselect, что упрощает очистку информации:

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

Дальнейшие действия

Дополнительные сведения о запросах JMESPath см. в руководстве по JMESPath.

Дополнительные сведения о других понятиях Azure CLI, упомянутых в этой статье, см. в следующих статьях: