使用 Bicep 和 Azure PowerShell 部署资源

本文介绍如何将 Azure PowerShell 与 Bicep 文件搭配来将资源部署到 Azure。 如果不熟悉部署和管理 Azure 解决方案的概念,请参阅 Bicep 概述

先决条件

需要一个 Bicep 文件进行部署。 该文件必须为本地。

需要 Azure PowerShell,并将其连接到 Azure:

所需的权限

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

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

部署范围

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

对于每一个范围,部署模板的用户必须具有创建资源所必需的权限。

部署本地 Bicep 文件

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

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

New-AzResourceGroup -Name ExampleGroup -Location "China North"

若要部署本地 Bicep 文件,请在部署命令中使用 -TemplateFile 开关。

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleGroup `
  -TemplateFile <path-to-bicep>

部署可能需要几分钟时间才能完成。

部署远程 Bicep 文件

目前,Azure PowerShell 不支持部署远程 Bicep 文件。 使用 Bicep CLI 将 Bicep 文件生成为 JSON 模板,然后将 JSON 文件加载到远程位置。

parameters

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

内联参数。

若要传递内联参数,请使用 New-AzResourceGroupDeployment 命令提供参数的名称。 例如,若要将字符串和数组传递给 Bicep 文件,请使用:

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-bicep> `
  -exampleString "inline string" `
  -exampleArray $arrayParam

可以使用 TemplateParameterObject 参数直通包含模板参数的哈希表。

$params = @{
  exampleString = "inline string"
  exampleArray = "value1", "value2"
}

New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-bicep> `
  -TemplateParameterObject $params

还可以获取文件的内容并将该内容作为内联参数提供。

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-bicep> `
  -exampleString $(Get-Content -Path c:\MyTemplates\stringcontent.txt -Raw) `
  -exampleArray $arrayParam

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

如果需要传入对象数组,请在 PowerShell 中创建哈希表并将其添加到数组中。 在部署过程中将该数组作为参数传递。

$hash1 = @{ Name = "firstSubnet"; AddressPrefix = "10.0.0.0/24"}
$hash2 = @{ Name = "secondSubnet"; AddressPrefix = "10.0.1.0/24"}
$subnetArray = $hash1, $hash2
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-bicep> `
  -exampleArray $subnetArray

Bicep 参数文件

与在脚本中将参数作为内联值传递相比,你可能会发现使用包含参数值的参数文件(.bicepparam 文件或 JSON 参数文件)更容易。 Bicep 参数文件必须是本地文件。

使用 Azure PowerShell CLI 10.4.0 或更高版本和 Bicep CLI 0.22.X 或更高版本,可以使用 Bicep 参数文件来部署 Bicep 文件。 使用 Bicep 参数文件中的 using 语句,在为 -TemplateParameterFile 开关指定 Bicep 参数文件时无需提供 -TemplateFile 开关。

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

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateParameterFile storage.bicepparam

有关参数文件的详细信息,请参阅创建资源管理器参数文件

JSON 参数文件

JSON 参数文件可以是本地文件,也可以是具有可访问 URI 的外部文件。 有关参数文件的详细信息,请参阅创建资源管理器参数文件

若要传递本地参数文件,请将 TemplateParameterFile 开关与 JSON 参数文件一起使用:

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\BicepFiles\storage.bicep `
  -TemplateParameterFile c:\BicepFiles\storage.parameters.json

若要传递外部参数文件,请使用 TemplateParameterUri 参数:

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\BicepFiles\storage.bicep `
  -TemplateParameterUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.parameters.json

参数 TemplateParameterUri 不支持 .bicepparam 文件,它仅支持 JSON 参数文件。

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

预览更改

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

部署模板规格

目前,Azure PowerShell 不支持通过提供 Bicep 文件来创建模板规格。 但是,可使用 Microsoft.Resources/templateSpecs 资源创建 Bicep 文件来部署模板规格。创建模板规格示例演示了如何在 Bicep 文件中创建模板规格。 还可使用 Bicep CLI 将 Bicep 文件生成到 JSON 中,然后使用 JSON 模板创建模板规格。

部署名称

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

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

若要创建唯一名称,你可以分配一个随机数。

$suffix = Get-Random -Maximum 1000
$deploymentName = "ExampleDeployment" + $suffix

或者,添加日期值。

$today=Get-Date -Format "MM-dd-yyyy"
$deploymentName="ExampleDeployment"+"$today"

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

但是,如果你运行一个名为 newStorage 的部署,它部署了一个名为 storage1 的存储帐户;在该部署完成时你又立即运行了另一个名为 newStorage 的部署,它部署了一个名为 storage2 的存储帐户,则你将有两个存储帐户。 一个名为 storage1,另一个名为 storage2。 但是,部署历史记录中只有一个条目。

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

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

后续步骤