快速入门:使用 Bicep 创建和部署模板规范
本快速入门介绍如何使用 Bicep 文件创建和部署模板规范。 模板规范将部署到资源组,使组织中的人员可以在 Azure 中部署资源。 使用模板规范可以共享部署模板,而无需为用户授予更改 Bicep 文件的访问权限。 此模板规范示例使用 Bicep 文件来部署存储帐户。
当你创建模板规范时,Bicep 文件将转译为 JavaScript 对象表示法 (JSON)。 模板规范使用 JSON 部署 Azure 资源。 目前无法使用 Azure 门户来导入 Bicep 文件和创建模板规范资源。
先决条件
创建 Bicep 文件
可以从本地 Bicep 文件创建模板规范。 复制以下示例并将其作为 main.bicep 保存到计算机上。 这些示例使用路径 C:\templates\main.bicep。 你可以使用不同的路径,但需要更改命令。
“PowerShell”和“CLI”选项卡中使用了以下 Bicep 文件。 “Bicep 文件”选项卡使用结合了 Bicep 和 JSON 的不同模板来创建和部署模板规范。
@allowed([
'Premium_LRS'
'Standard_GRS'
'Standard_LRS'
'Standard_RAGRS'
])
@description('Storage account type.')
param storageAccountType string = 'Standard_LRS'
@description('Location for all resources.')
param location string = resourceGroup().location
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountType
}
kind: 'StorageV2'
properties: {}
}
output storageAccountNameOutput string = storageAccount.name
创建模板规格
模板规格是名为 Microsoft.Resources/templateSpecs 的资源类型。 若要创建模板规范,请使用 Azure CLI、Azure PowerShell 或 Bicep 文件。
此示例使用资源组名称 templateSpecRG
。 你可以使用不同的名称,但需要更改命令。
创建新的资源组以包含模板规格。
New-AzResourceGroup `
-Name templateSpecRG `
-Location chinanorth2
在该资源组中创建模板规格。 将新的模板规格命名为 storageSpec。
New-AzTemplateSpec `
-Name storageSpec `
-Version "1.0" `
-ResourceGroupName templateSpecRG `
-Location chinanorth2 `
-TemplateFile "C:\templates\main.bicep"
创建新的资源组以包含模板规格。
az group create \
--name templateSpecRG \
--location chinanorth2
在该资源组中创建模板规格。 将新的模板规格命名为 storageSpec。
az ts create \
--name storageSpec \
--version "1.0" \
--resource-group templateSpecRG \
--location chinanorth2 \
--template-file "C:\templates\main.bicep"
可以使用 Bicep 文件创建模板规范,但 mainTemplate
必须采用 JSON 格式。 JSON 模板不使用标准 JSON 语法。 例如,不包含行尾逗号,双引号将替换为单引号,反斜杠 (\
) 用于转义表达式中的单引号。
复制以下模板并将其作为 main.bicep 保存到计算机上。
param templateSpecName string = 'storageSpec'
param templateSpecVersionName string = '1.0'
@description('Location for all resources.')
param location string = resourceGroup().location
resource createTemplateSpec 'Microsoft.Resources/templateSpecs@2022-02-01' = {
name: templateSpecName
location: location
}
resource createTemplateSpecVersion 'Microsoft.Resources/templateSpecs/versions@2022-02-01' = {
parent: createTemplateSpec
name: templateSpecVersionName
location: location
properties: {
mainTemplate: {
'$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#'
'contentVersion': '1.0.0.0'
'metadata': {}
'parameters': {
'storageAccountType': {
'type': 'string'
'defaultValue': 'Standard_LRS'
'metadata': {
'description': 'Storage account type.'
}
'allowedValues': [
'Premium_LRS'
'Standard_GRS'
'Standard_LRS'
'Standard_RAGRS'
]
}
'location': {
'type': 'string'
'defaultValue': '[resourceGroup().location]'
'metadata': {
'description': 'Location for all resources.'
}
}
}
'variables': {
'storageAccountName': '[format(\'{0}{1}\', \'storage\', uniqueString(resourceGroup().id))]'
}
'resources': [
{
'type': 'Microsoft.Storage/storageAccounts'
'apiVersion': '2023-04-01'
'name': '[variables(\'storageAccountName\')]'
'location': '[parameters(\'location\')]'
'sku': {
'name': '[parameters(\'storageAccountType\')]'
}
'kind': 'StorageV2'
'properties': {}
}
]
'outputs': {
'storageAccountNameOutput': {
'type': 'string'
'value': '[variables(\'storageAccountName\')]'
}
}
}
}
}
使用 Azure PowerShell 或 Azure CLI 创建新的资源组。
New-AzResourceGroup `
-Name templateSpecRG `
-Location chinanorth2
az group create \
--name templateSpecRG \
--location chinanorth2
在该资源组中创建模板规格。 模板规范名称 storageSpec 和版本号 1.0
是 Bicep 文件中的参数。
New-AzResourceGroupDeployment `
-ResourceGroupName templateSpecRG `
-TemplateFile "C:\templates\main.bicep"
az deployment group create \
--resource-group templateSpecRG \
--template-file "C:\templates\main.bicep"
部署模板规格
使用模板规范部署存储帐户。 此示例使用资源组名称 storageRG
。 你可以使用不同的名称,但需要更改命令。
创建资源组以包含新的存储帐户。
New-AzResourceGroup `
-Name storageRG `
-Location chinanorth2
获取模板规格的资源 ID。
$id = (Get-AzTemplateSpec -ResourceGroupName templateSpecRG -Name storageSpec -Version "1.0").Versions.Id
部署模板规格。
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG
提供的参数应与用于 Bicep 文件部署的参数完全相同。 使用存储帐户类型的参数重新部署模板规格。
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG `
-storageAccountType Standard_GRS
创建资源组以包含新的存储帐户。
az group create \
--name storageRG \
--location chinanorth2
获取模板规格的资源 ID。
id=$(az ts show --name storageSpec --resource-group templateSpecRG --version "1.0" --query "id")
注意
获取模板规格 ID 并将其分配到 Windows PowerShell 中的变量时存在一个已知问题。
部署模板规格。
az deployment group create \
--resource-group storageRG \
--template-spec $id
提供的参数应与用于 Bicep 文件部署的参数完全相同。 使用存储帐户类型的参数重新部署模板规格。
az deployment group create \
--resource-group storageRG \
--template-spec $id \
--parameters storageAccountType="Standard_GRS"
若要使用 Bicep 文件部署模板规范,请使用某个模块。 该模块链接到现有的模板规范。有关详细信息,请参阅模板规范中的文件。
复制以下 Bicep 模块并将其作为 storage.bicep 保存到计算机上。
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:1.0' = {
name: 'deployVersion1'
}
替换模块中的 <subscriptionId>
。 使用 Azure PowerShell 或 Azure CLI 获取你的订阅 ID。
(Get-AzContext).Subscription.Id
az account show --query "id" --output tsv
使用 Azure PowerShell 或 Azure CLI 为存储帐户创建新的资源组。
New-AzResourceGroup `
-Name storageRG `
-Location chinanorth2
az group create \
--name storageRG \
--location chinanorth2
使用 Azure PowerShell 或 Azure CLI 部署模板规范。
New-AzResourceGroupDeployment `
-ResourceGroupName storageRG `
-TemplateFile "C:\templates\storage.bicep"
az deployment group create \
--resource-group storageRG \
--template-file "C:\templates\storage.bicep"
可以添加一个参数并使用不同的存储帐户类型重新部署模板规范。 复制示例并替换 storage.bicep 文件。 然后,重新部署模板规范部署。
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:1.0' = {
name: 'deployVersion1'
params: {
storageAccountType: 'Standard_GRS'
}
}
授予访问权限
如果要让组织中的其他用户部署模板规格,你需要向他们授予读取权限。 对于包含要共享的模板规格的资源组,你可以将读取者角色分配给 Microsoft Entra 组。 有关详细信息,请参阅教程:使用 Azure PowerShell 授予组对 Azure 资源的访问权限。
更新 Bicep 文件
创建模板规范后,你决定更新 Bicep 文件。 若要继续使用“PowerShell”或“CLI”选项卡中的示例,请复制示例并替换 main.bicep 文件。
参数 storageNamePrefix
指定存储帐户名称的前缀值。 storageAccountName
变量将前缀与唯一字符串连接起来。
@allowed([
'Premium_LRS'
'Standard_GRS'
'Standard_LRS'
'Standard_RAGRS'
])
@description('Storage account type.')
param storageAccountType string = 'Standard_LRS'
@description('Location for all resources.')
param location string = resourceGroup().location
@maxLength(11)
@description('The storage account name prefix.')
param storageNamePrefix string = 'storage'
var storageAccountName = '${toLower(storageNamePrefix)}${uniqueString(resourceGroup().id)}'
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountType
}
kind: 'StorageV2'
properties: {}
}
output storageAccountNameOutput string = storageAccount.name
更新模板规格版本
在现有模板规范中添加名为 2.0
的新版本,而不是为修改后的模板创建新的模板规范。用户可以选择部署任一版本。
创建模板规范的新版本。
New-AzTemplateSpec `
-Name storageSpec `
-Version "2.0" `
-ResourceGroupName templateSpecRG `
-Location chinanorth2 `
-TemplateFile "C:\templates\main.bicep"
若要部署新版本,请获取 2.0
版本的资源 ID。
$id = (Get-AzTemplateSpec -ResourceGroupName templateSpecRG -Name storageSpec -Version "2.0").Versions.Id
部署新版本并使用 storageNamePrefix
指定存储帐户名称的前缀。
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG `
-storageNamePrefix "demo"
创建模板规范的新版本。
az ts create \
--name storageSpec \
--version "2.0" \
--resource-group templateSpecRG \
--location chinanorth2 \
--template-file "C:\templates\main.bicep"
若要部署新版本,请获取 2.0
版本的资源 ID。
id=$(az ts show --name storageSpec --resource-group templateSpecRG --version "2.0" --query "id")
部署新版本并使用 storageNamePrefix
指定存储帐户名称的前缀。
az deployment group create \
--resource-group storageRG \
--template-spec $id \
--parameters storageNamePrefix="demo"
创建模板规范的新版本。复制示例并替换 main.bicep 文件。
参数 storageNamePrefix
指定存储帐户名称的前缀值。 storageAccountName
变量将前缀与唯一字符串连接起来。
param templateSpecName string = 'storageSpec'
param templateSpecVersionName string = '2.0'
@description('Location for all resources.')
param location string = resourceGroup().location
resource createTemplateSpec 'Microsoft.Resources/templateSpecs@2022-02-01' = {
name: templateSpecName
location: location
}
resource createTemplateSpecVersion 'Microsoft.Resources/templateSpecs/versions@2022-02-01' = {
parent: createTemplateSpec
name: templateSpecVersionName
location: location
properties: {
mainTemplate: {
'$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#'
'contentVersion': '1.0.0.0'
'metadata': {}
'parameters': {
'storageAccountType': {
'type': 'string'
'defaultValue': 'Standard_LRS'
'metadata': {
'description': 'Storage account type.'
}
'allowedValues': [
'Premium_LRS'
'Standard_GRS'
'Standard_LRS'
'Standard_RAGRS'
]
}
'location': {
'type': 'string'
'defaultValue': '[resourceGroup().location]'
'metadata': {
'description': 'Location for all resources.'
}
}
'storageNamePrefix': {
'type': 'string'
'defaultValue': 'storage'
'metadata': {
'description': 'The storage account name prefix.'
}
'maxLength': 11
}
}
'variables': {
'storageAccountName': '[format(\'{0}{1}\', toLower(parameters(\'storageNamePrefix\')), uniqueString(resourceGroup().id))]'
}
'resources': [
{
'type': 'Microsoft.Storage/storageAccounts'
'apiVersion': '2023-04-01'
'name': '[variables(\'storageAccountName\')]'
'location': '[parameters(\'location\')]'
'sku': {
'name': '[parameters(\'storageAccountType\')]'
}
'kind': 'StorageV2'
'properties': {}
}
]
'outputs': {
'storageAccountNameOutput': {
'type': 'string'
'value': '[variables(\'storageAccountName\')]'
}
}
}
}
}
若要将新版本添加到模板规范,请使用 Azure PowerShell 或 Azure CLI 部署模板。
New-AzResourceGroupDeployment `
-ResourceGroupName templateSpecRG `
-TemplateFile "C:\templates\main.bicep"
az deployment group create \
--resource-group templateSpecRG \
--template-file "C:\templates\main.bicep"
复制以下 Bicep 模块并将其作为 storage.bicep 保存到计算机上。
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:2.0' = {
name: 'deployVersion2'
params: {
storageNamePrefix: 'demo'
}
}
替换模块中的 <subscriptionId>
。 使用 Azure PowerShell 或 Azure CLI 获取你的订阅 ID。
(Get-AzContext).Subscription.Id
az account show --query "id" --output tsv
使用 Azure PowerShell 或 Azure CLI 部署模板规范。
New-AzResourceGroupDeployment `
-ResourceGroupName storageRG `
-TemplateFile "C:\templates\storage.bicep"
az deployment group create \
--resource-group storageRG \
--template-file "C:\templates\storage.bicep"
清理资源
若要清理本快速入门中部署的资源,请删除创建的两个资源组。 将删除资源组、模板规范和存储帐户。
使用 Azure PowerShell 或 Azure CLI 删除资源组。
Remove-AzResourceGroup -Name "templateSpecRG"
Remove-AzResourceGroup -Name "storageRG"
az group delete --name templateSpecRG
az group delete --name storageRG
后续步骤