Практическое руководство по использованию Azure CLI в среде Bash

Справочные команды Azure CLI могут выполняться в нескольких разных средах оболочки, но в документации Майкрософт в основном описывается среда Bash. Если вы не знакомы с Bash, а также Azure CLI, эта статья отлично подходит для начала обучения. Ознакомьтесь с этой статьей, чтобы узнать, как использовать Azure CLI в среде Bash с легкостью.

Вы узнаете, как выполнять следующие задачи:

  • Отправлять запросы к результатам в виде словарей или массивов JSON.
  • Форматировать выходные данные в виде JSON, таблицы или TSV.
  • Фильтровать, форматировать одиночные или множественные значения и отправлять запросы к ним.
  • Использовать if/exists/then и синтаксис CASE.
  • Использовать циклы for.
  • Использовать команды grep, sed, paste и bc.
  • Заполнять и использовать переменные оболочки и среды.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

Запуск Bash

Запустите Bash с помощью Azure Cloud Shell или локальной установки Azure CLI. В этой статье предполагается, что вы используете Bash с помощью Azure Cloud Shell или azure CLI локально в контейнере Docker.

Запрос результатов словаря

Команда, которая всегда возвращает только один объект, возвращает словарь JSON. Словари — это неупорядоченные объекты, доступ к которым осуществляется с помощью ключей. В этой статье мы начнем с запроса объекта Account с помощью команды Account Show .

az account show
az account show --output json # JSON is the default format

В следующих выходных данных словаря JSON для краткости опущены некоторые поля, а идентифицирующие данные удалены или обобщены.

bash-5.1# az account show
{
  "environmentName": "AzureCloud",
  "isDefault": true,
  "managedByTenants": [],
  "name": "My test subscription",
  "state": "Enabled",
  "user": {
    "name": "user@contoso.com",
    "type": "user"
  }
}

Форматирование выходных данных в виде YAML

Воспользуйтесь аргументом --output yaml (или -o yaml), чтобы отформатировать выходные данные в формате YAML (формат сериализации текстовых данных). YAML легче для восприятия, чем JSON, и сопоставим с ним. Входные данные конфигурации некоторых приложений и команд CLI задаются в формате YAML, а не JSON.

az account show --output yaml

Дополнительные сведения о форматировании выходных данных в виде YAML см. в разделе Выходной формат YAML.

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

Воспользуйтесь аргументом --output table (или -o table), чтобы отформатировать выходные данные в виде ASCII-таблицы. Вложенные объекты не включаются в таблицу с выходными данными, но их можно отфильтровать как часть запроса.

az account show --output table

Дополнительные сведения о форматировании выходных данных в виде таблицы см. в разделе Выходной формат таблицы.

Запрашивание и форматирование одиночных и вложенных значений

Следующие запросы демонстрируют запрашивание отдельных значений, включая вложенные значения в выходных данных словаря JSON. Окончательный запрос в этом наборе демонстрирует форматирование выходных данных с помощью аргумента -o tsv. Этот аргумент возвращает результаты в виде значений, разделенных знаком табуляции и новой строки. Это действие полезно для удаления кавычки в возвращаемом значении. Это полезно для использования выходных данных в других командах и средствах, которые должны обрабатывать текст в некоторой форме (как показано далее в этой статье).

az account show --query name # Querying a single value
az account show --query name -o tsv # Removes quotation marks from the output

az account show --query user.name # Querying a nested value
az account show --query user.name -o tsv # Removes quotation marks from the output

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

Следующий запрос демонстрирует получение свойств в массиве JSON. Получение свойств подписки, отображаемое в виде таблицы подписок.

az account list --query "[].{subscription_id:id, name:name, isDefault:isDefault}" -o table

Этот запрос возвращает результаты, аналогичные следующим:

Subscription_id                       Name                                               IsDefault
------------------------------------  -------------------------------------------------  -----------
11111111-3ddc-45ce-8334-c7b28a9e1c3a  C & L Azure developer experience content projects  False
22222222-8f1c-409b-af1e-8e2e65d9b90a  DevCenter - Infrastructure - Dogfood               False
33333333-c080-42a7-8973-1aa853ab4df3  Babel                                              False

Запрашивание и форматирование нескольких значений, включая вложенные значения

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

az account show --query [name,id,user.name] # return multiple values
az account show --query [name,id,user.name] -o table # return multiple values as a table

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

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

В следующих запросах демонстрируется использование оператора { } (хэш-таблица) для получения словаря вместо массива при запрашивании нескольких значений. Он также демонстрирует переименование свойств в результатах запроса.

az account show --query "{SubscriptionName: name, SubscriptionId: id, UserName: user.name}" # Rename the values returned
az account show --query "{SubscriptionName: name, SubscriptionId: id, UserName: user.name}" -o table # Rename the values returned in a table

Дополнительные сведения о переименовании свойств в запросе см. в разделе Переименование свойств в запросе.

Запрашивание логических значений

Предполагается, что логические значения имеют значение true, поэтому синтаксис запроса "[?isDefault]" для команды az account list возвращает текущую подписку по умолчанию. Чтобы получить ложные значения, необходимо использовать escape-символ, например \.

В следующих запросах показано, как запрашивать все учетные записи в подписке, потенциально возвращая массив JSON, если для данной учетной записи существует несколько подписок, а затем запрашивать, для какой учетной записи используется подписка по умолчанию. Он также демонстрирует запросы учетных записей, которые не являются подпиской по умолчанию. Эти запросы используют описанное ранее для фильтрации и форматирования результатов. Наконец, окончательный запрос демонстрирует сохранение результатов запроса в переменной.

az account list
az account list --query "[?isDefault]" # Returns the default subscription
az account list --query "[?isDefault]" -o table # Returns the default subscription as a table
az account list --query "[?isDefault].[name,id]" # Returns the name and id of the default subscription
az account list --query "[?isDefault].[name,id]" -o table # Returns the name and id of the default subscription as a table
az account list --query "[?isDefault].{SubscriptionName: name, SubscriptionId: id}" -o table # Returns the name and id of the default subscription as a table with friendly names

az account list --query "[?isDefault == \`false\`]" # Returns all non-default subscriptions, if any
az account list --query "[?isDefault == \`false\`].name" -o table # Returns all non-default subscriptions, if any, as a table

az account list --query "[?isDefault].id" -o tsv # Returns the subscription id without quotation marks
subscriptionId="$(az account list --query "[?isDefault].id" -o tsv)" # Captures the subscription id as a variable.
echo $subscriptionId # Returns the contents of the variable.
az account list --query "[? contains(name, 'Test')].id" -o tsv # Returns the subscription id of a non-default subscription containing the substring 'Test'
subscriptionId="$(az account list --query "[? contains(name, 'Test')].id" -o tsv) # Captures the subscription id as a variable. 
az account set -s $subscriptionId # Sets the current active subscription

Создание объектов с помощью переменных и случайной выборки

Установка случайного значения для использования в последующих командах

Установка и использование случайного значения для использования в переменных позволяет выполнять скрипты несколько раз без возникновения конфликтов именования. Конфликты именования могут возникать из-за того, что значение должно быть уникальным в службе или поскольку удаленный объект по-прежнему существует в Azure до завершения процесса удаления.

$RANDOM — это функция bash (не константа), которая возвращает случайное целое число со знаком 16-разрядного (от 0 до 32767). Эта команда let является встроенной командой Bash для оценки арифметических выражений. Следующая команда создает применимое уникальное значение для большинства целей.

let "randomIdentifier=$RANDOM*$RANDOM"

Работа с пробелами и кавычками

Пробелы используются для разделения команд, параметров и аргументов. Используйте кавычки, чтобы указать оболочке Bash игнорировать все специальные символы (пробел является специальным символом). Когда оболочка Bash видит первую кавычку, она игнорирует специальные символы до закрывающей кавычки. Но иногда требуется, чтобы оболочка Bash анализировала определенные специальные символы, такие как знак доллара, обратные кавычки и обратные косые черты. В этом сценарии используйте двойные кавычки.

Следующие команды используют команду az group create, чтобы проиллюстрировать использование однократных и двойных кавычек. Эти команды используются для обработки пробелов и оценки специальных символов при работе с переменными и создании объекта.

resourceGroup='msdocs-learn-bash-$randomIdentifier'
echo $resourceGroup # The $ is ignored in the creation of the $resourceGroup variable
resourceGroup="msdocs-learn-bash-$randomIdentifier"
echo $resourceGroup # The $randomIdentifier is evaluated when defining the $resourceGroup variable
location="East US" # The space is ignored when defining the $location variable
echo The value of the location variable is $location # The value of the $location variable is evaluated
echo "The value of the location variable is $location" # The value of the $location variable is evaluated
echo "The value of the location variable is \$location" # The value of the $location variable is not evaluated
echo 'The value of the location variable is $location' # The value of the $location variable is not evaluated
az group create --name $resourceGroup --location $location # Notice that the space in the $location variable is not ignored and the command fails as it treats the value after the space as a new command 
az group create --name $resourceGroup --location "$location" # Notice that the space in the $location variable is ignored and the location argument accepts the entire string as the value 

В выходных данных словаря JSON просмотрите свойства созданной группы ресурсов.

Использование If Then Else для определения того, имеет ли переменная значение NULL

Чтобы оценить строки, используйте !=, а для оценки чисел используйте -ne. Следующая инструкция If Then Else оценивает, задана ли переменная $resourceGroup. Если да, возвращается значение переменной. Если нет, она задает переменную.

if [ $resourceGroup != '' ]; then
   echo $resourceGroup
else
   resourceGroup="msdocs-learn-bash-$randomIdentifier"
fi

Использование If Then для создания или удаления группы ресурсов

Следующий скрипт создает новую группу ресурсов, только если она с указанным именем еще не существует.

if [ $(az group exists --name $resourceGroup) = false ]; then 
   az group create --name $resourceGroup --location "$location" 
else
   echo $resourceGroup
fi

Следующий скрипт удаляет существующую новую группу ресурсов, если она существует с указанным именем. Вы можете использовать аргумент --no-wait, чтобы вернуть элемент управления, не ожидая завершения команды. Но в этой статье мы хотим дождаться удаления группы ресурсов, прежде чем продолжить. Дополнительные сведения об асинхронных операциях см. в разделе Асинхронные операции. Мы демонстрируем использование аргумента --no-wait в конце этой статьи.

if [ $(az group exists --name $resourceGroup) = true ]; then 
   az group delete --name $resourceGroup -y # --no-wait
else
   echo The $resourceGroup resource group does not exist
fi

Использование Grep для определения того, существует ли группа ресурсов, и создайте группу ресурсов, если она не существует.

Следующая команда передает выходные данные команды az group list в команду grep. Если указанная группа ресурсов не существует, команда создает группу ресурсов с помощью ранее определенных переменных.

az group list --output tsv | grep $resourceGroup -q || az group create --name $resourceGroup --location "$location"

Использование инструкции CASE для определения того, существует ли группа ресурсов, и создайте группу ресурсов, если она не существует.

Следующая инструкция CASE создает новую группу ресурсов, только если одна с указанным именем еще не существует. Если группа с указанным именем существует, инструкция CASE сообщает об этом.

var=$(az group list --query "[? contains(name, '$resourceGroup')].name" --output tsv)
case $resourceGroup in
$var)
echo The $resourceGroup resource group already exists.;;
*)
az group create --name $resourceGroup --location "$location";;
esac

Использование циклов и отправка запросов к массивам

В этом разделе статьи мы создадим учетную запись хранения, а затем используем циклы для создания больших двоичных объектов и контейнеров. Мы также демонстрируем запросы массивов JSON и работу с переменными среды.

Создание учетной записи хранения

Следующая команда использует команду az storage account create для создания учетной записи хранения, используемой при создании контейнеров хранения.

storageAccount="learnbash$randomIdentifier"
az storage account create --name $storageAccount --location "$location" --resource-group $resourceGroup --sku Standard_LRS --encryption-services blob

Получение ключей учетной записи хранения

Следующие команды используют команду az storage account keys list для возврата значений ключей учетной записи хранения. Затем мы сохраним значение ключа в переменной для использования при создании контейнеров хранилища.

az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[].value" -o tsv # returns both storage account key values

az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[0].value" -o tsv # returns a single storage account key value

accountKey=$(az storage account keys list --resource-group $resourceGroup --account-name $storageAccount --query "[0].value" -o tsv)

echo $accountKey

Создание контейнера хранилища

Начнем с использования контейнера az storage create для создания одного контейнера хранилища, а затем используйте список контейнеров az storage для запроса имени созданного контейнера.

container="learningbash"
az storage container create --account-name $storageAccount --account-key $accountKey --name $container

az storage container list --account-name $storageAccount --account-key $accountKey --query [].name

Отправка данных в контейнер

Следующий скрипт создает три примера файлов с помощью цикла for.

for i in `seq 1 3`; do
    echo $randomIdentifier > container_size_sample_file_$i.txt
done

Следующий скрипт использует команду az storage blob upload-batch для отправки BLOB-объектов в контейнер хранилища.

az storage blob upload-batch \
    --pattern "container_size_sample_file_*.txt" \
    --source . \
    --destination $container \
    --account-key $accountKey \
    --account-name $storageAccount

Следующий скрипт использует команду az storage blob list для вывода списка BLOB-объектов в контейнере.

az storage blob list \
    --container-name $container \
    --account-key $accountKey \
    --account-name $storageAccount \
    --query "[].name"

Следующий скрипт отображает общее число байт в контейнере хранилища.

bytes=`az storage blob list \
    --container-name $container \
    --account-key $accountKey \
    --account-name $storageAccount \
    --query "[*].[properties.contentLength]" \
    --output tsv | paste -s -d+ | bc`

echo "Total bytes in container: $bytes"
echo $bytes

Создание большого числа контейнеров с помощью циклов

Затем мы создадим несколько контейнеров с помощью цикла, демонстрирующего несколько способов записи цикла.

for i in `seq 1 4`; do 
az storage container create --account-name $storageAccount --account-key $accountKey --name learnbash-$i
done

for value in {5..8}
for (( i=5; i<10; i++));
do
az storage container create --account-name $storageAccount --account-key $accountKey --name learnbash-$i
done

az storage container list --account-name $storageAccount --account-key $accountKey --query [].name

Использование EXPORT для определения переменных среды

В предыдущих скриптах контейнера хранилища мы указали в каждой команде имя учетной записи и ключ учетной записи. Вместо этого можно сохранить учетные данные аутентификации с помощью соответствующих переменных среды: AZURE_STORAGE_ACCOUNT и AZURE_STORAGE_KEY. Для выполнения этого действия используйте EXPORT.

export AZURE_STORAGE_ACCOUNT=$storageAccount
export AZURE_STORAGE_KEY=$accountKey
az storage container list # Uses the environment variables to display the list of containers.

Следующий скрипт создает строку метаданных, а затем использует команду az storage container metadata update для обновления контейнера этой строкой, опять же используя переменные среды.

metadata="key=value pie=delicious" # Define metadata
az storage container metadata update \
    --name $container \
    --metadata $metadata # Update the metadata
az storage container metadata show \
    --name $containerName # Show the metadata

Следующая команда использует команду az storage container delete для удаления отдельного именованного контейнера, а затем удаления нескольких контейнеров в цикле.

az storage container delete \
    --name $container

Получите список контейнеров, содержащих определенный префикс, и сохраните результаты в переменной.

containerPrefix="learnbash"
containerList=$(az storage container list \
    --query "[].name" \
    --prefix $containerPrefix \
    --output tsv)

Удалите список контейнеров в цикле с помощью аргумента --prefix.

for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    az storage container delete \
    --name $tmpName 
done

Обработка ошибок

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

set -e

Дополнительные сведения о настройке параметров оболочки и другой справки выполните следующие команды:

help set
help help

Очистка ресурсов

По завершении этой статьи удалите группу ресурсов и все ресурсы в ней. Используйте аргумент --no-wait.

if [ $(az group exists --name $resourceGroup) = true ]; then 
   az group delete --name $resourceGroup -y  --no-wait
else
   echo The $resourceGroup resource group does not exist
fi

См. также