你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

填充脚本中使用的变量

在本教程步骤中,了解如何使用变量:

  • 执行 Azure CLI 命令,并将输出存储在变量中。
  • 读取本地 JSON 文件,并将属性值存储在变量中。

变量的一些常见用例包括:

  • 获取有关现有 Azure 资源的信息,例如资源 ID。
  • 从 Azure CLI 命令(例如密码)获取输出。
  • 获取环境信息的 JSON 对象,例如开发、阶段和生产 ID。

然后,可以在 Azure CLI 中使用该变量大规模执行编译和销毁作业。

先决条件

  • 使用存储帐户级别的 reader 或更高权限,可以访问资源组和存储帐户。

使用 JMESPath 查询获取命令输出

使用 show 命令的 --query 参数获取有关现有 Azure 资源的信息。 执行 JMESPath 查询,并返回 Azure 资源的一个或多个属性值。

提示

--query 的语法区分大小写,且特定于环境。 如果收到空结果,请检查大写情况。 通过应用了解 Bash、PowerShell 和 Cmd 中的 Azure CLI 语法差异来避免引用错误

除非指定了 --output 参数,否则这些示例依赖于在为 Azure CLI 准备环境中设置的 json 默认输出配置

获取 Azure 资源的 JSON 字典属性

使用在了解 Bash、PowerShell 和 Cmd 直接的 Azure CLI 语法差异中创建的存储帐户,获取新存储帐户的 primaryEndpoints

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

控制台 JSON 字典输出:

{
  "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/"
}

获取单个 JSON 对象

指定以逗号分隔的存储帐户属性列表以返回数组(列表)中的单个属性。

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

控制台 JSON 数组输出:

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

重命名属性

使用大括号({})和逗号分隔的列表重命名属性。 新属性名称不能包含空格。 此示例以 table 格式返回输出。

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

控制台表输出。 --output table 中每个列名中第一个字母会大写:

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

筛选查询结果

将你学到的关于引用的内容与刚刚学到的--query结合起来。 这些示例应用了筛选器。

在 Bash 中,不能在等号 (=) 符号之前或之后有空格。 可以选择对变量值使用引号,这样可使 msdocs-tutorial-rg-00000000"msdocs-tutorial-rg-00000000" 都是正确的。

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

创建新的 Azure 资源,将输出存储在变量中

了解将命令输出存储在变量中,有利于创建输出机密应受保护的 Azure 资源。 例如,创建服务主体、重置凭据或获取 Azure 密钥保管库机密时,应保护命令输出。

创建新的 Azure Key Vault 和机密,将命令输出返回到变量。 Azure Key Vault 名称必须全局唯一,因此此示例中使用 $RANDOM 标识符。 有关更多 Azure Key Vault 命名规则,请参阅 Azure Key Vault 的常见错误代码

这些示例使用 echo 来验证变量值,因为这是教学教程。 不要对生产级环境中的机密和密码值使用 echo

# 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

获取 JSON 文件的内容并将其存储在变量中

下一部分是加入教程的“延伸任务”。 但是,若要在开发、阶段和生产环境中管理 Azure 资源,通常需要读取配置文件。

是否已准备好扩展 Azure CLI 技能? 创建包含以下 JSON 的 JSON 文件,或自己选择文件内容。 将文本文件保存到本地驱动器。 如果使用的是 Azure Cloud Shell,请使用菜单栏中的 upload/download files 图标将文本文件存储在云存储驱动器中。

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

将 JSON 文件的内容存储在变量中,以便在 Azure CLI 命令中进一步使用。 在此示例中,将 msdocs-tutorial.json 更改为文件的名称。 不要将 echo 命令保存在生产级脚本中,因为输出会保存在日志文件中。

此 Bash 脚本在 Azure Cloud Shell 中进行了测试,取决于必须在环境中安装的 Bash jq

# 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

是否收到了“找不到 jq 命令”错误? 这是因为此脚本依赖于 Bash jq 命令。 在环境中安装 jq,或在 Azure Cloud Shell 中运行此脚本。

现在,你有一个存储在变量中的特定于环境的 Azure Key Vault 机密名称,可以使用它连接到 Azure 资源。 若要重复使用 Azure CLI 脚本,此方法适用于 Azure VM 和 SQL Server 连接字符串的 IP 地址。

获取更多详细信息

想要更详细地了解本教程步骤中介绍的某项主题吗? 请使用下表中的链接了解详细信息。

主题 了解详细信息
变量 请参阅成功使用 Azure CLI - 将值传递到另一个命令中的高级示例
阅读如何在 Azure CLI 命令中使用变量中有关变量的概述。
查询 有关详细信息,请参阅如何使用 JMESPath 查询语句查询 Azure CLI 命令输出
使用了解如何将 Bash 与 Azure CLI 配合使用中的 --query,进行更深入的探讨。
Azure Key Vault 关于 Azure Key Vault
使用 Azure 基于角色的访问控制提供对密钥保管库密钥、证书和机密的访问权限
Azure Key Vault 的常见错误代码
PowerShell 参考链接:Get-contentWhere-ObjectSelect-Object

下一步

了解如何使用变量存储 Azure CLI 命令输出和 JSON 属性值后,请继续学习,了解如何使用脚本删除 Azure 资源。