成功使用 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% |
| 循环 | until、while 或 for |
for、Foreach、while、do-while、do-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 示例脚本索引有三个选项卡:
- 按主题区域列出:使用此选项卡查找 Azure 服务的示例。
- 按引用组列出:使用此选项卡查找引用命令组的示例。
- Azure CLI 示例 GitHub 存储库:使用此选项卡在 Azure CLI 示例 GitHub 存储库中找到示例。
Copilot
Azure 门户和 Microsoft Edge 都提供 Copilot 体验,这些体验返回有关 Azure CLI 参考命令、示例和已发布的文章的信息。 Copilot 还提供指向相关 Stack Overflow 问题的链接。 如果很难完成多个脚本步骤,则 Copilot 有助于编译多个信息源来回答你的问题。