如何使用 Bicep 和 Azure CLI 部署资源

本文介绍如何将 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 或命令提示符中运行此示例,可能需要更改脚本的元素。

部署范围

可将部署目标设定为资源组、订阅、管理组或租户。 根据部署范围使用不同的命令。

对于每个范围,部署 Bicep 文件的用户必须拥有创建资源所需的权限。

部署本地 Bicep 文件

可以部署本地计算机中的 Bicep 文件,也可以部署存储在外部的模板。 本节介绍如何部署本地 Bicep 文件。

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

az group create --name ExampleGroup --location "China North"

若要部署本地 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 文件加载到远程位置。 有关详细信息,请参阅部署远程 ARM 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 与 Windows 命令提示符 (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 脚本中所示:

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

在要传递给对象的 JSON 两侧使用双引号。

如果要将 Azure CLI 与 Windows 命令提示符 (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 与 Windows 命令提示符 (CMD) 或 PowerShell 一起使用,请将变量设置为 JSON 字符串。 转义引号:$params = '{ \"prefix\": {\"value\":\"start\"}, \"suffix\": {\"value\":\"end\"} }'

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

Bicep 参数文件

你可能会发现,与在脚本中以内联值的形式传递参数相比,使用包含参数值的参数文件(Bicep 参数文件JSON 参数文件)更为容易。 参数文件必须是本地文件。 Azure CLI 不支持外部参数文件。 有关参数文件的详细信息,请参阅创建资源管理器参数文件

使用 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 的存储帐户,则部署历史记录中将有两个存储帐户和两个条目。

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

后续步骤