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


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

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

В этой статье вы узнаете, как:

  • Результаты запроса в виде словарей ИЛИ массивов JSON
  • Форматирование выходных данных в формате JSON, таблицы или TSV
  • Запрос, фильтрация и форматирование отдельных и нескольких значений
  • Использование синтаксиса if/exists/then и case
  • Использование циклов
  • Используйте команды 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 [ $(az group exists --name $resourceGroup) = false ]; then 
   az group create --name $resourceGroup --location "$location" 
else
   echo $resourceGroup
fi

Следующий скрипт удаляет существующую новую группу ресурсов, если она уже существует с указанным именем. Вы можете использовать аргумент --no-wait для возврата управления, не ожидая завершения команды. Однако для этой статьи мы хотим дождаться удаления группы ресурсов, прежде чем продолжить. Дополнительные сведения об асинхронных операциях см. в советах по использованию Azure CLI — асинхронные операции. Мы демонстрируем использование аргумента --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

Использование циклов for и запрос данных из массивов

В этом разделе статьи мы создадим учетную запись хранения, а затем используем циклы for для создания блобов и контейнеров. Мы также демонстрируем запросы массивов 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 для перечисления блобов в контейнере.

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

См. также