Populate variables for use in scripts

In this tutorial step, learn to work with variables:

  • Execute an Azure CLI command and store output in a variable.
  • Read a local JSON file and store property values in a variable.

Some common use-cases for variables are:

  • Get information about an existing Azure resource, such as a resource ID.
  • Get output from an Azure CLI command, such as a password.
  • Get JSON objects for environment information, such as development, stage and production IDs.

The variable can then be used in Azure CLI to perform build and destroy jobs at scale.

Prerequisites

  • You have access to a resource group and storage account with reader or higher permissions at a storage account level.

Get command output using JMESPath query

Get information about an existing Azure resource using the --query parameter of the show command. A JMESPath query is executed and one or more property values of an Azure resource are returned.

Tip

The syntax for --query is case sensitive and environment-specific. If you receive empty results, check your capitalization. Avoid quoting errors by applying the rules you learned in Learn Azure CLI syntax differences in Bash, PowerShell and Cmd

Unless the --output parameter is specified, these examples rely on a default output configuration of json set in Prepare your environment for the Azure CLI

Get JSON dictionary properties of an Azure resource

Using the storage account created in Learn Azure CLI syntax differences in Bash, PowerShell and Cmd, get the primaryEndpoints of your new storage account.

az storage account show --resource-group <msdocs-tutorial-rg-00000000> \
                        --name <msdocssa000000000> \
                        --query primaryEndpoints

Console JSON dictionary output:

{
  "blob": "https://msdocssa00000000.blob.core.windows.net/",
  "dfs": "https://msdocssa00000000.dfs.core.windows.net/",
  "file": "https://msdocssa00000000.file.core.windows.net/",
  "internetEndpoints": null,
  "microsoftEndpoints": null,
  "queue": "https://msdocssa00000000.queue.core.windows.net/",
  "table": "https://msdocssa00000000.table.core.windows.net/",
  "web": "https://msdocssa00000000.z13.web.core.windows.net/"
}

Get individual JSON objects

Specify a comma-delimited list of storage account properties to return individual properties in an array (list).

az storage account show --resource-group <msdocs-tutorial-rg-00000000> \
                        --name <msdocssa000000000> \
                        --query "[id, primaryLocation, primaryEndpoints.blob, encryption.services.blob.lastEnabledTime]"

Console JSON array output:

[
  "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/msdocs-tutorial-rg-00000000/providers/Microsoft.Storage/storageAccounts/   msdocssa000000000",
  "eastus",
  "https://msdocssa000000000.blob.core.windows.net/",
  "yyyy-mm-ddT19:11:56.399484+00:00"
]

Rename properties

Rename properties using curly brackets ({}) and a comma-delimited list. The new property names can't contain spaces. This example returns output in table format.

az storage account show --resource-group <msdocs-tutorial-rg-00000000> \
                        --name <msdocssa000000000> \
                        --query "{saName:name, saKind:kind, saMinTLSVersion:minimumTlsVersion}" \
                        --output table

Console table output. The first letter of each column is capitalized in --output table:

SaName             SaKind     SaMinTLSversion
-----------------  ---------  -----------------
msdocssa000000000  StorageV2  TLS1_0

Filter query results

Combine what you learned about quoting with what you just learned about --query. These examples apply a filter.

In Bash, you can't have a space before or after the equal (=) sign. You can opt to use quotes around the variable value, so msdocs-tutorial-rg-00000000 and "msdocs-tutorial-rg-00000000" are both correct.

rgName=<msdocs-tutorial-rg-00000000>

# Get a list of all Azure storage accounts that allow blob public access.
# Notice the backticks and escape characters needed for boolean values.
az storage account list --resource-group $rgName \
                        --query "[?allowBlobPublicAccess == \`true\`].name"

# Get a list of Azure storage accounts that were created in the last 30 days. Return the results as a table.
saDate=$(date +%F -d "-30days")
az storage account list --resource-group $rgName \
                        --query "[?creationTime >='$saDate'].{saName:name, createdTimeStamp:creationTime}" \
                        --output table

# Get a list of Azure storage accounts created in this tutorial
az storage account list --resource-group $rgName \
                        --query "[?contains(name, 'msdocs')].{saName:name, saKind:kind, saPrimaryLocation:primaryLocation, createdTimeStamp:creationTime}" \
                        --output table

Create a new Azure resource storing output in a variable

Learning to store command output in a variable is beneficial when creating Azure resources that output secrets that should be protected. For example, when you create a service principal, reset a credential, or get an Azure key vault secret, the command output should be protected.

Create a new Azure Key Vault and secret returning command output to a variable. Your Azure Key Vault name must be globally unique, so the $RANDOM identifier is used in this example. For more Azure Key Vault naming rules, see Common error codes for Azure Key Vault.

These examples use echo to verify variable values because this is a teaching tutorial. Don't use echo for secret and password values in production-level environments.

# Set your variables.
let "randomIdentifier=$RANDOM*$RANDOM"
rgName=<msdocs-tutorial-rg-00000000>
kvName=msdocs-kv-$randomIdentifier
location=eastus

# Set your default output to none
az config set core.output=none

# Create a new Azure Key Vault returning the Key Vault ID
myNewKeyVaultID=$(az keyvault create --name $kvName --resource-group $rgName --location $location --query id --output tsv)
echo "My new Azure Kev Vault ID is $myNewKeyVaultID"

# Wait about 1 minute for your Key Vault creation to complete.

# Create a new secret returning the secret ID
kvSecretName=<myKVSecretName>
kvSecretValue=<myKVSecretValue>
myNewSecretID=$(az keyvault secret set --vault-name $kvName --name $kvSecretName --value $kvSecretValue --query id --output tsv)
echo "My new secret ID is $myNewSecretID"

# Reset your default output to json
az config set core.output=json

Get the contents of a JSON file and store it in a variable

This next section is a "stretch task" for an onboarding tutorial. However, to manage Azure resources in development, stage and production environments, you often need to read a configuration file.

Are you ready to stretch your Azure CLI skills? Create a JSON file containing the following JSON, or your file contents of choice. Save the text file to your local drive. If you're working in Azure Cloud Shell, use the upload/download files icon in the menu bar to store the text file in your cloud storage drive.

{
  "environments": {
    "dev": [
      {
        "id": "1",
        "kv-secretName": "dev1SecretName",
        "status": "inactive",
      },
      {
        "id": "2",
        "kv-secretName": "dev2SecretName",
        "status": "active"
      }
    ],
    "stg": {
      "id": "3",
      "kv-secretName": "dev3SecretName"
    },
    "prod": {
      "id": "4",
      "kv-secretName": "dev4SecretName"
    }
  }
}

Store the contents of your JSON file in a variable for further use in your Azure CLI commands. In this example, change msdocs-tutorial.json to the name of your file. Don't save the echo command in production-level scripts as the output is saved in your log file.

This Bash script was tested in Azure Cloud Shell and depends on the Bash jq which must be installed in your environment.

# Show the contents of a file in the console
fileName=msdocs-tutorial.json
cat $fileName | jq

# Get a JSON dictionary object
stgKV=$(jq -r '.environments.stg."kv-secretName"' $fileName)
echo $stgKV

# Filter a JSON array
devKV=$(jq -r '.environments.dev[] | select(.status=="active") | ."kv-secretName"' $fileName)
echo $devKV

Did you just receive a "jq command not found" error? This is because this script depends on the Bash jq command. Install jq in your environment, or run this script in Azure Cloud Shell.

You now have an environment-specific Azure Key Vault secret name stored in a variable, and you can use it to connect to Azure resources. This same method is good for IP addresses of Azure VMs and SQL Server connection strings when you want to reuse Azure CLI scripts.

Get more details

Do you want more detail on one of the subjects covered in this tutorial step? Use the links in this table to learn more.

Subject Learn more
Variables See advanced examples in Use the Azure CLI successfully - Pass values to another command
Read a good overview of variables in How to use variables in Azure CLI commands.
Querying Find a wide range of examples in How to query Azure CLI command output using a JMESPath query.
Take a deeper dive in Bash using --query in Learn to use Bash with the Azure CLI.
Azure key vault About Azure Key Vault
Provide access to Key Vault keys, certificates, and secrets with an Azure role-based access control.
Common error codes for Azure Key Vault
PowerShell Reference links: Get-content, Where-Object, Select-Object

Next Step

Now that you understand how to use variables to store Azure CLI command output and JSON property values, proceed to the next step to learn how to use scripts to delete Azure resources.