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

使用 Azure CLI 部署 Bicep 文件

本文介绍如何将 Azure CLI 与 Bicep 文件配合使用,以将资源部署到 Azure。 如果不熟悉如何部署和管理 Azure 解决方案,请参阅什么是 Bicep?

先决条件

你需要一个 Bicep 文件才能进行部署,并且该文件必须是本地文件。 还需要 Azure CLI 并将其连接到 Azure:

  • 在本地计算机上安装 Azure CLI 命令。 若要部署 Bicep 文件,需要安装 Azure CLI 2.20.0 或更高版本。
  • 使用 az login 连接到 Azure。 如果拥有多个 Azure 订阅,则可能还需要运行 az account set

适用于 Azure CLI 的示例是针对 bash shell 编写的。 要在 Windows PowerShell 或命令提示符 (cmd) 中运行此示例,可能需要更改脚本的元素。

如果未安装 Azure CLI,可以使用 Azure Cloud Shell。 有关详细信息,请参阅使用 Azure Cloud Shell 部署 Bicep 文件

所需的权限

若要部署 Bicep 文件或 ARM 模板,需要对要部署的资源具有写入权限,并且需要对 Microsoft.Resources/deployments 资源类型的所有操作具有访问权限。 例如,若要部署虚拟机,需要 Microsoft.Compute/virtualMachines/writeMicrosoft.Resources/deployments/* 权限。 What-if 操作具有相同的权限要求。

有关角色和权限的列表,请参阅 Azure 内置角色

部署范围

可将部署目标设定为资源组、订阅、管理组或租户。 根据部署的范围使用不同的命令,并且部署 Bicep 文件的用户必须具有为每个范围创建资源所需的权限。

部署本地 Bicep 文件

可以从本地计算机或外部计算机部署 Bicep 文件。 本部分介绍如何部署本地 Bicep 文件。

如果要部署到不存在的资源组,请创建该资源组。 资源组名称只能包含字母数字字符、句点、下划线、连字符和括号。 它最多可以包含 90 个字符,并旦不能以句点结尾。

az group create --name ExampleGroup --location "Central US"

若要部署本地 Bicep 文件,请在部署命令中使用 --template-file 开关。 以下示例还演示了如何设置参数值:

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-file <path-to-bicep> \
  --parameters storageAccountType=Standard_GRS

部署可能需要几分钟才能完成。 完成后,你会看到一条包含以下结果的消息:

"provisioningState": "Succeeded",

部署远程 Bicep 文件

目前,Azure CLI 不支持部署远程 Bicep 文件。 你可以使用 Bicep CLI 将 Bicep 文件构建为 JSON 模板,然后将 JSON 文件加载到远程位置。 有关详细信息,请参阅部署远程模板

参数

若要传递参数值,可以使用内联参数或参数文件。 参数文件可以是 Bicep 参数文件,也可以是 JSON 参数文件

内联参数。

若要传递内联参数,请在 parameters 中提供值。 例如,若要在 Bash shell 中将字符串和数组传递给 Bicep 文件,请使用:

az deployment group create \
  --resource-group testgroup \
  --template-file <path-to-bicep> \
  --parameters exampleString='inline string' exampleArray='["value1", "value2"]'

如果要将 Azure CLI 与 cmd 或 PowerShell 配合使用,请按以下格式传递数组:exampleArray="['value1','value2']"

还可以获取文件的内容,以将该内容作为内联参数提供。 在文件名前加上 @

az deployment group create \
  --resource-group testgroup \
  --template-file <path-to-bicep> \
  --parameters exampleString=@stringContent.txt exampleArray=@arrayContent.json

当需要提供配置值时,从文件中获取参数值非常有用。 例如,可以为 Linux 虚拟机提供 cloud-init 值

arrayContent.json 格式为:

[
  "value1",
  "value2"
]

要传入对象,请使用 JSON(例如设置标记时)。 Bicep 文件可能包含如下所示的参数:

"resourceTags": {
  "type": "object",
  "defaultValue": {
    "Cost Center": "IT Department"
  }
}

还可以传入 JSON 字符串来设置参数,如以下 Bash 脚本中所示。 在要传递给对象的 JSON 两侧使用双引号:

tags='{"Owner":"Contoso","Cost Center":"2345-324"}'
az deployment group create --name addstorage  --resource-group myResourceGroup \
--template-file $bicepFile \
--parameters resourceName=abcdef4556 resourceTags="$tags"

如果要将 Azure CLI 与 cmd 或 PowerShell 配合使用,请采用以下格式传递对象:

$tags="{'Owner':'Contoso','Cost Center':'2345-324'}"
az deployment group create --name addstorage  --resource-group myResourceGroup \
--template-file $bicepFile \
--parameters resourceName=abcdef4556 resourceTags=$tags

可以使用变量来包含参数值。 在 Bash 脚本中,将变量设置为所有参数值,并将其添加到部署命令:

params="prefix=start suffix=end"

az deployment group create \
  --resource-group testgroup \
  --template-file <path-to-bicep> \
  --parameters $params

但如果将 Azure CLI 与 cmd 或 PowerShell 配合使用,请将变量设置为 JSON 字符串。 转义引号:$params = '{ \"prefix\": {\"value\":\"start\"}, \"suffix\": {\"value\":\"end\"} }'

参数的计算遵循序列顺序,这意味着如果多次分配一个值,则只会使用最后一次分配的值。 要正确分配参数,建议最初提供参数文件,然后使用 KEY=VALUE 语法选择性地替代特定参数。 如果要提供 .bicepparam 参数文件,则只能使用此参数一次。

Bicep 参数文件

与在脚本中将参数作为内联值传递相比,你可能会发现使用包含参数值的 Bicep 参数文件JSON 参数文件更容易。 参数文件必须是本地文件,因为 Azure CLI 不支持外部参数文件。 有关参数文件的详细信息,请参阅创建参数文件以进行 Bicep 部署

可以通过 Azure CLI 版本 2.53.0 或更高版本以及 Bicep CLI 版本 0.22.X 或更高版本使用 Bicep 参数文件来部署 Bicep 文件。 在 Bicep 参数文件中使用 using 语句时,无需在为 --parameters 开关指定 Bicep 参数文件时提供 --template-file 开关。 如果包括 --template-file 开关,将会提示“仅允许对 .bicepparam 文件使用 .bicep 模板”错误。

以下示例演示名为 storage.bicepparam 的参数文件。 该文件位于运行此命令的同一目录中:

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --parameters storage.bicepparam

JSON 参数文件

以下示例演示名为 storage.parameters.json 的参数文件。 该文件位于运行此命令的同一目录中:

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-file storage.bicep \
  --parameters '@storage.parameters.json'

可以在同一部署操作中使用内联参数和位置参数文件。 有关详细信息,请参阅参数优先级

预览更改

在部署 Bicep 文件之前,可以预览 Bicep 文件将对环境做出的更改。 使用假设操作验证 Bicep 文件是否进行预期更改。 假设操作还验证 Bicep 文件是否有错误。

部署模板规格

目前,Azure CLI 不提供 Bicep 文件来帮助创建模板规格。 但可以使用 Microsoft.Resources/templateSpecs 资源创建 Bicep 文件来部署模板规格。创建模板规格示例演示了如何在 Bicep 文件中创建模板规格。 还可以使用 Bicep CLI 将 Bicep 文件构建为 JSON,然后再使用 JSON 模板来创建模板规范。

部署名称

部署 Bicep 文件时,可以为部署指定名称。 此名称可以帮助你从部署历史记录中检索该部署。 如果没有为部署提供名称,则会使用 Bicep 文件的名称。 例如,如果部署一个名为 main.bicep 的 Bicep 文件,但未指定部署名称,则该部署将会命名为 main

每次运行部署时,一个包含部署名称的条目会添加到资源组的部署历史记录中。 如果运行另一个部署并为其指定了相同的名称,则会将先前的条目替换为当前部署。 如果要在部署历史记录中保持唯一条目,请为每个部署指定唯一名称。

要创建唯一的名称,可以分配一个随机数:

deploymentName='ExampleDeployment'$RANDOM

或添加日期值:

deploymentName='ExampleDeployment'$(date +"%d-%b-%Y")

如果使用相同的部署名称对同一资源组运行并发部署,则仅会完成最后一个部署。 尚未完成的具有相同名称的任何部署都将被最后一个部署所替换。 例如,如果运行一个名为 newStorage 的部署,它部署了一个名为 storage1 的存储帐户;同时,你运行了另一个名为 newStorage 的部署,它部署了一个名为 storage2 的存储帐户,则只会部署一个存储帐户。 生成的存储帐户名为 storage2

但如果你运行一个名为 newStorage 的部署,它部署了一个名为 storage1 的存储帐户;然后立即运行另一个名为 newStorage 的部署,它部署了一个名为 storage2 的存储帐户,则会拥有两个存储帐户。 一个名为 storage1,另一个名为 storage2。 但是,部署历史记录中只有一个条目。

为每个部署指定唯一的名称时,可以并发运行它们而不会发生冲突。 如果你运行一个名为 newStorage1 的部署,它部署了一个名为 storage1 的存储帐户;同时,你运行了另一个名为 newStorage2 的部署,它部署了一个名为 storage2 的存储帐户,则会拥有两个存储帐户,并在在部署历史记录中拥有两个条目。

为避免与并发部署冲突并确保部署历史记录中的条目是唯一的,请为每个部署指定唯一的名称。

后续步骤

若要了解如何在文件中定义参数,请参阅了解 Bicep 文件的结构和语法