成功使用 Azure CLI 的提示

已完成

在本模块中,你学习了如何选择环境、安装 Azure CLI、以交互方式执行 Azure CLI 命令以及创建 Bash 脚本。 让我们进一步学习一步,重点介绍如何成功使用 Azure CLI。 本单元介绍如何在命令行后面使用 Azure CLI,并提供故障排除提示。

小窍门

本模块是一门高级课程,本单元将深入介绍 Azure CLI。 如果你不熟悉命令行编程,请专注于概念。 在获得经验时,详细信息更易于理解。 不要放弃!

了解 Azure CLI API 调用

在 Azure 门户的图形用户界面和 Azure CLI 命令行的背后,是 API 调用在执行。 通过--debug参数,可以公开 Azure CLI 的 API 调用。 下面是创建新资源组时会发生什么情况:

az group create --location westus1 --name myResourceGroupName --debug

下面是 Azure Cloud Shell 的终端输出,为了简洁起见,省略了一些行。 请注意这一重要输出:

  • 命令参数:它是分析命令参数(参数)的脚本语言,而不是 Azure CLI。 当命令导致错误时,首先查找此输出属性。
  • azlogging:此路径是日志文件的存储位置。
  • 请求标头:这些标头是 PUT 命令传递的参数值。
  • 响应内容:此输出是返回到控制台的内容,不包含完整的 --debug 输出。
cli.knack.cli: Command arguments: ['group', 'create', '--location', 'westus2', '--name', 'myResourceGroupName', '--debug']
cli.knack.cli: __init__ debug log:
...
cli.knack.cli: Event: CommandInvoker.OnPreCommandTableCreate []
cli.azure.cli.core: Modules found from index for 'group': ['azure.cli.command_modules.resource']
cli.azure.cli.core: Loading command modules:
...
cli.azure.cli.core: Loaded 53 groups, 233 commands.
cli.azure.cli.core: Found a match in the command table.
cli.azure.cli.core: Raw command  : group create
...
cli.azure.cli.core.azlogging: metadata file logging enabled - writing logs to '/home/myName/.azure/commands/2025-02-17.21-47-27.group_create.5217.log'.
...
cli.azure.cli.core.sdk.policies: Request URL: 'https://management.azure.com/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/myResourceGroupName?api-version=2022-09-01'
cli.azure.cli.core.sdk.policies: Request method: 'PUT'
cli.azure.cli.core.sdk.policies: Request headers:
cli.azure.cli.core.sdk.policies:     'Content-Type': 'application/json'
cli.azure.cli.core.sdk.policies:     'Content-Length': '23'
cli.azure.cli.core.sdk.policies:     'Accept': 'application/json'
cli.azure.cli.core.sdk.policies:     'x-ms-client-request-id': 'c79caddc-ed78-11ef-8a83-00155dbc433c'
cli.azure.cli.core.sdk.policies:     'CommandName': 'group create'
cli.azure.cli.core.sdk.policies:     'ParameterSetName': '--location --name --debug'
...
cli.azure.cli.core.sdk.policies: Response content:
...
{
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroupName",
  "location": "westus2",
  "managedBy": null,
  "name": "myResourceGroupName",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}
cli.knack.cli: Event: Cli.SuccessfulExecute []
cli.knack.cli: Event: Cli.PostExecute [<function AzCliLogging.deinit_cmd_metadata_logging at 0x7f98a6bc7820>]
az_command_data_logger: exit code: 0
...

某些 Azure CLI 命令执行多个操作。 用于 --debug 查看 Azure CLI 正在执行的每个命令。 用于排查 Azure CLI 脚本产生意外结果的原因,更有用的是使用 --debug

故障排除

作为开发人员,你曾想过多少次,“这个任务应该如此简单! 为什么我的脚本无法正常工作?从 Azure CLI 命令收到意外结果时, --debug 参数是你的朋友! 我们来看一个有 100 个 Azure 存储帐户的公司的例子。 需要查找启用了 Blob 公共访问的帐户。

# Bash script
resourceGroup="msdocs-rg-00000000"
az storage account list --resource-group $resourceGroup --query "[?allowBlobPublicAccess == `true`].id"

如果参数值的格式不符合用于分析该值的脚本语言的正确要求,则会收到“invalid jmespath_type value”错误。

cli.knack.cli: Command arguments: ['storage', 'account', 'list', '--resource-group', 'msdocs-tutorial-rg-69794242', '--query', '[?allowBlobPublicAccess == ].id', '--debug']
...
cli.azure.cli.core.azclierror: argument --query: invalid jmespath_type value: '[?allowBlobPublicAccess == ].id'
az_command_data_logger: argument --query: invalid jmespath_type value: '[?allowBlobPublicAccess == ].id'

查看 Bash 传递的 allowBlobPublicAccess 变量值。 事实上,价值在哪里? 为什么它缺失?

请记住,环境也称为“脚本语言”,用于分析 Azure CLI 变量值。 每个脚本语言 ,甚至同一脚本语言的版本都可以产生不同的结果。 下面是在 Bash 中传递布尔参数值的正确方法:

# Bash script
resourceGroup="msdocs-rg-00000000"
az storage account list --resource-group $resourceGroup --query "[?allowBlobPublicAccess == \`true\`].id" --debug
cli.knack.cli: Command arguments: ['storage', 'account', 'list', '--resource-group', 'msdocs-rg-00000000', '--query', '[?allowBlobPublicAccess == `true`].id', '--debug']
...
[
  "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-rg-00000000/providers/Microsoft.Storage/storageAccounts/msdocssa00000000"
]

掌握重要概念 --debug ,并在所选环境中成功使用 Azure CLI。

脚本语言语法差异

随着我们刚刚讨论 --debug完毕,下一步是了解导致大多数脚本错误的原因:在 Bash 中编写的脚本需要修改才能在 PowerShell 中成功执行,或者如果脚本包含以下构造之一,则需要修改 cmd.exe:

  • 续行符
  • 变量
  • 随机标识符
  • 引号
  • 编程语言构造

下面是一些示例:

语法 Bash PowerShell cmd.exe
行继续符 反斜杠 (\) 反引号 (`) 胡萝卜 (^)
变量命名 variableName=varValue $variableName=“varValue” set variableName=varValue
数字作为字符串 \`50\` “'50'” “50”
布尔值作为字符串 \`true\` ''false'' 'true'
随机 ID let "randomIdentifier=$RANDOM*$RANDOM" $randomIdentifier = (New-Guid)。ToString()。Substring(0,8) set randomIdentifier=%RANDOM%
循环 untilwhilefor forForeachwhiledo-whiledo-until for-[...]
写入控制台 echo write-host(首选)或 echo echo

此示例表不是全面的。 收到 Azure CLI 错误时需要了解的重要一点是,首先要考虑环境可能存在语法问题。 通过将 脚本复制并粘贴到另一种脚本语言(例如 Azure Cloud Shell)来测试这种可能性。 在两个环境中使用 --debug ,并记下 command arguments 输出属性的差异。

重要

从Microsoft文章复制代码块时,请注意,Microsoft中的大多数 Azure CLI 文档都是针对 Bash 编写的,并在 Azure Cloud Shell 中进行测试。

获取帮助的更多方法

az find 命令

通过以下示例快速了解 Azure CLI 命令:

  • 查找与“blob”一词相关的最常用命令

    az find blob
    
  • 显示 Azure CLI 命令组的最常用命令,如 az storage

    az find "az storage"
    
  • 显示 Azure CLI 命令的最常用参数和子命令:

    az find "az storage account create"
    

--help 参数

如果你已经知道所需命令的名称,该命令的 --help 参数会提供有关该命令的更多详细信息;而对于命令组,它会提供可用子命令的列表。 继续学习 Azure 存储示例,下面介绍了如何获取用于管理存储帐户 Blob 服务的子组和命令的列表:

az account blob-service-properties --help

A 到 Z 索引

若要查找 Azure CLI 参考命令的示例,请使用多个 A 到 Z 索引之一。

  • Azure CLI 的 引用索引 提供所有引用组的 A 到 Z 列表。 展开左侧导航栏以显示子组。

  • Azure CLI 概念文章列表提供了快速入门的 A 到 Z 列表、如何指导、教程和学习模块,这些模块介绍如何在现实世界方案中使用 Azure CLI 参考命令。 本文按 Azure CLI 命令组(例如 az account,等 az acr )对文章进行分组。使用 Windows 中的 CTRL + F (macOS 中的命令 + F )快速跳转到所选命令组。

  • Azure CLI 示例脚本索引有三个选项卡:

Copilot

Azure 门户和 Microsoft Edge 都提供 Copilot 体验,这些体验返回有关 Azure CLI 参考命令、示例和已发布的文章的信息。 Copilot 还提供指向相关 Stack Overflow 问题的链接。 如果很难完成多个脚本步骤,则 Copilot 有助于编译多个信息源来回答你的问题。