Compartir a través de


Cómo utilizar la CLI de Azure en el lenguaje de scripting de Bash

Los comandos de referencia de la CLI de Azure pueden ejecutarse en varios lenguajes de scripting. Si no está familiarizado con Bash y también la CLI de Azure, este artículo es un excelente lugar para comenzar su recorrido de aprendizaje. Trabaja en este artículo como con un tutorial para aprender a usar fácilmente la CLI de Azure en un lenguaje de scripting de Bash.

En este artículo aprenderá a:

  • Resultados de la consulta como diccionarios o matrices JSON
  • Dar formato a la salida como JSON, tabla o TSV
  • Consulta, filtro y formato de uno y varios valores
  • Utiliza la sintaxis if/exists/then y case
  • Uso de bucles for
  • Uso de comandos grep, sed, paste y bc
  • Asignar y usar variables de shell y de entorno

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Inicio de Bash

Inicie Bash mediante Azure Cloud Shell o una instalación local de la CLI de Azure. En este artículo se da por supuesto que está ejecutando Bash mediante Azure Cloud Shell o ejecutando la CLI de Azure localmente en un contenedor de Docker.

Consultar los resultados del diccionario

Un comando que siempre devuelve un solo objeto devuelve un diccionario JSON. Los diccionarios son objetos sin ordenar a los que se accede con claves. Para este artículo, vamos a empezar consultando el objeto Account mediante el comando Account Show .

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

La siguiente salida del diccionario JSON tiene algunos campos omitidos para mayor brevedad y se quita la información de identificación.

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

Formatear la salida como YAML

Utilice el argumento --output yaml (o -o yaml) para dar formato a la salida en yaml, un formato de serialización de datos de texto sin formato. YAML suele ser más fácil de leer que JSON y se corresponde fácilmente con ese formato. Algunas aplicaciones y los comandos de la CLI aceptan YAML como entrada de configuración, en lugar de JSON.

az account show --output yaml

Para obtener más información sobre cómo dar formato a la salida como yaml, consulte Formato de salida de YAML.

Formato de la salida como una tabla

Use el --output table argumento (o -o table) para dar formato a la salida como una tabla ASCII. Los objetos anidados no se incluyen en la tabla de salida, pero se pueden filtrar como parte de una consulta.

az account show --output table

Para obtener más información sobre cómo dar formato a la salida como una tabla, vea Formato de salida de tabla.

Consulta y formato de valores únicos y valores anidados

Las consultas siguientes muestran la consulta de valores únicos, incluidos los valores anidados en una salida del diccionario JSON. La consulta final de este conjunto muestra el formato de la salida mediante el -o tsv argumento . Este argumento devuelve los resultados como valores separados por tabulador y nueva línea. Esta acción es útil para quitar comillas en el valor devuelto, lo que resulta útil para consumir la salida en otros comandos y herramientas que necesitan procesar el texto de algún modo (como se muestra más adelante en este artículo).

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

Consulta y formato de propiedades de matrices

La consulta siguiente muestra cómo obtener propiedades en una matriz JSON. Obtiene las propiedades de la suscripción, que se muestran como una tabla de suscripciones.

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

Esta consulta devuelve resultados similares a los siguientes:

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

Consulta y formateo de varios valores, incluidos los valores anidados

Para obtener más de una propiedad, coloque expresiones entre corchetes [ ] (una lista de selección múltiple) como una lista separada por comas. Las consultas siguientes muestran la consulta de varios valores en una salida del diccionario JSON mediante varios formatos de salida.

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

Para obtener más información sobre cómo devolver varios valores, vea Obtener varios valores.

Cambiar el nombre de las propiedades de una consulta

Las consultas siguientes muestran el uso del operador { } (hash de selección múltiple) para obtener un diccionario en lugar de una matriz al consultar varios valores. También muestra el cambio de nombre de las propiedades en el resultado de la consulta.

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

Para obtener más información sobre cómo cambiar el nombre de las propiedades de una consulta, vea Cambiar el nombre de las propiedades en una consulta.

Consulta de valores booleanos

Se supone que los valores booleanos son true, por lo que la "[?isDefault]" sintaxis de consulta del az account list comando devuelve la suscripción predeterminada actual. Para obtener los valores falsos, debe usar un carácter de escape, como \.

Las consultas siguientes muestran la consulta de todas las cuentas de una suscripción, lo que podría devolver una matriz JSON si hay varias suscripciones para una cuenta determinada y, a continuación, consultar qué cuenta es la suscripción predeterminada. También muestra la consulta de las cuentas que no son la suscripción predeterminada. Estas consultas se basan en lo que ha aprendido anteriormente para filtrar y dar formato a los resultados. Por último, la consulta final muestra cómo almacenar los resultados de la consulta en una variable.

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

Creación de objetos mediante variables y selección aleatoria

Establecimiento de un valor aleatorio para su uso en comandos posteriores

Establecer y usar un valor aleatorio para su uso en variables permite ejecutar scripts varias veces sin conflictos de nomenclatura. Los conflictos de nomenclatura se producen porque un valor debe ser único en el servicio o porque un objeto que eliminó todavía existe en Azure hasta que se complete el proceso de eliminación.

$RANDOM es una función bash (no una constante) que devuelve un entero de 16 bits con signo aleatorio (de 0 a 32767). El let comando es un comando de Bash integrado para evaluar expresiones aritméticas. Con el comando siguiente se crea un valor suficientemente único para la mayoría de los propósitos.

let "randomIdentifier=$RANDOM*$RANDOM"

Trabajar con espacios y comillas

Los espacios se usan para separar comandos, opciones y argumentos. Use comillas para indicar al shell de Bash que omita todos los caracteres especiales, de los cuales un espacio en blanco es un carácter especial. Cuando Bash ve la primera comilla, omite los caracteres especiales hasta la comilla de cierre. Sin embargo, a veces necesitas que el shell de Bash analice determinados caracteres especiales, como signos de dólar, comillas inversas y barras invertidas. En este escenario, use comillas dobles.

Los siguientes comandos usan el comando az group create para ilustrar el uso de comillas simples y dobles. Estos comandos se usan para controlar espacios y evaluar caracteres especiales al trabajar con variables y crear un objeto.

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 

En la salida del diccionario JSON, revise las propiedades del grupo de recursos que se creó.

Usar If Then Else para determinar si la variable es null

Para evaluar cadenas, use != y para evaluar números use -ne. La siguiente instrucción If Then Else evalúa si se ha establecido la variable $resourceGroup. Si es así, devuelve el valor de la variable. Si no, establece la variable .

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

Uso de If Then para crear o eliminar un grupo de recursos

El script siguiente crea un nuevo grupo de recursos solo si aún no existe uno con el nombre especificado.

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

El script siguiente elimina un nuevo grupo de recursos existente si ya existe uno con el nombre especificado. Puede usar el --no-wait argumento para devolver el control sin esperar a que se complete el comando. Sin embargo, para este artículo, queremos esperar a que se elimine el grupo de recursos antes de continuar. Para más información sobre las operaciones asincrónicas, consulte Sugerencias para usar correctamente la CLI de Azure: operaciones asincrónicas. Se muestra el uso del --no-wait argumento al final de este artículo.

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

Utilizar Grep para determinar si existe un grupo de recursos y crear el grupo de recursos si no existe.

El siguiente comando canaliza la salida del az group list comando al grep comando . Si el grupo de recursos especificado no existe, el comando crea el grupo de recursos mediante las variables definidas anteriormente.

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

Uso de la instrucción CASE para determinar si existe un grupo de recursos y crear el grupo de recursos si no existe.

La siguiente instrucción CASE crea un nuevo grupo de recursos solo si aún no existe uno con el nombre especificado. Si existe una con el nombre especificado, la instrucción CASE devuelve que el grupo de recursos existe.

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

Uso de bucles for y consultas de matrices

En esta sección del artículo, creamos una cuenta de almacenamiento y, a continuación, usamos ciclos 'for' para crear archivos blob y contenedores. También se muestra cómo consultar matrices JSON y trabajar con variables de entorno.

Crear cuenta de almacenamiento

El comando siguiente usa el comando az storage account create para crear una cuenta de almacenamiento que se usa al crear contenedores de almacenamiento.

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

Obtención de las claves de la cuenta de almacenamiento

Los comandos siguientes usan el comando az storage account keys list para devolver los valores de clave de la cuenta de almacenamiento. A continuación, almacenamos un valor de clave en una variable para su uso al crear contenedores de almacenamiento.

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

Creación de un contenedor de almacenamiento

Comenzamos con el az storage container create para crear un único contenedor de almacenamiento y, a continuación, usamos la lista az storage container list para consultar el nombre del contenedor creado.

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

Carga de datos en el contenedor

El script siguiente crea tres archivos de ejemplo mediante un bucle for.

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

El script siguiente usa el comando az storage blob upload-batch para cargar los blobs en el contenedor de almacenamiento.

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

El script siguiente usa el comando az storage blob list para enumerar los blobs del contenedor.

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

El siguiente script muestra el total de bytes en el contenedor de almacenamiento.

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

Creación de muchos contenedores mediante bucles

A continuación, creamos varios contenedores mediante un bucle que muestra un par de formas de escribir el bucle.

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

Uso de EXPORT para definir variables de entorno

En los scripts de contenedor de almacenamiento anteriores, se especificó el nombre de cuenta y la clave de cuenta con cada comando. En su lugar, puede almacenar las credenciales de autenticación mediante las variables de entorno correspondientes: AZURE_STORAGE_ACCOUNT y AZURE_STORAGE_KEY. Para realizar esta acción, use 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.

El script siguiente crea una cadena de metadatos y, a continuación, usa el comando az storage container metadata update para actualizar un contenedor con esa cadena, de nuevo mediante las variables de entorno.

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

El comando siguiente usa el comando az storage container delete para eliminar un único contenedor con nombre y, a continuación, eliminar varios contenedores en un bucle.

az storage container delete \
    --name $container

Obtenga la lista de contenedores que contienen un prefijo específico y almacene los resultados en una variable.

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

Elimine la lista de contenedores de un bucle mediante el --prefix argumento .

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

Control de errores

Para salir de un script inmediatamente si un comando devuelve un estado distinto de cero, ejecute el siguiente comando:

set -e

Para obtener más información sobre cómo establecer opciones de shell y otra ayuda, ejecute los siguientes comandos:

help set
help help

Limpieza de recursos

Después de completar este artículo, elimine el grupo de recursos y todos los recursos que contiene. Use el --no-wait argumento .

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

Consulte también