了解 Bicep 文件的结构和语法

本文介绍 Bicep 文件的结构和语法。 本文演示了文件的不同部分,以及可在相应部分使用的属性。

有关指导你完成 Bicep 文件创建过程的分步教程,请参阅快速入门:使用 Visual Studio Code 创建 Bicep 文件

Bicep 格式

Bicep 是一种声明性语言,这意味着元素可以按任何顺序显示。 元素的顺序不会影响处理部署的方式,这与命令性语言不同。

Bicep 文件具有以下元素:

@<decorator>(<argument>)
metadata <metadata-name> = ANY

targetScope = '<scope>'

@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>

@<decorator>(<argument>)
func <user-defined-function-name> (<argument-name> <data-type>, <argument-name> <data-type>, ...) <function-data-type> => <expression>

@<decorator>(<argument>)
param <parameter-name> <parameter-data-type> = <default-value>

@<decorator>(<argument>)
var <variable-name> = <variable-value>

@<decorator>(<argument>)
resource <resource-symbolic-name> '<resource-type>@<api-version>' = {
  <resource-properties>
}

@<decorator>(<argument>)
module <module-symbolic-name> '<path-to-file>' = {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
}

@<decorator>(<argument>)
output <output-name> <output-data-type> = <output-value>

以下示例演示了这些元素的实现。

metadata description = 'Creates a storage account and a web app'

@description('The prefix to use for the storage account name.')
@minLength(3)
@maxLength(11)
param storagePrefix string

param storageSKU string = 'Standard_LRS'
param location string = resourceGroup().location

var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'

resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageSKU
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
  }
}

module webModule './webApp.bicep' = {
  name: 'webDeploy'
  params: {
    skuName: 'S1'
    location: location
  }
}

元数据

Bicep 中的元数据是一种非类型化值,可以将其包含在 Bicep 文件中。 元数据提供有关 Bicep 文件的补充信息,如名称、说明、作者和创建日期。

目标作用域

默认情况下,目标作用域设置为 resourceGroup。 如果要在资源组级别进行部署,则无需在 Bicep 文件中设置目标范围。

允许的值为:

在模块中,指定的范围可以不同于 Bicep 文件其余部分的范围。 有关详细信息,请参阅配置模块范围

修饰符

可以为以下每个元素添加一个或多个修饰器:

下表列出了这些修饰器。

修饰器 应用于元素 应用于数据类型 Argument 说明
允许 param 全部 array 使用此修饰器以确保用户提供正确的值。 只有在 param 语句中才允许使用此修饰器。 要声明某个属性必须是 typeoutput 语句中一组预定义值之一,请使用联合类型语法。 也可以在 param 语句中使用联合类型语法。
batchSize module, resource 空值 integer 设置实例以按顺序部署。
description func, param, module, output, resource, type, var 全部 string 提供元素的说明。 使用 Markdown 格式的文本作为说明文本。
鉴别器 param, type, output object string 使用此装饰器可确保识别和管理正确的子类。 有关详细信息,请参阅自定义标记的联合数据类型
导出 func, type, var 全部 表示另一个 Bicep 文件可以导入该元素。
maxLength param, output, type 数组、字符串 int 字符串和数组元素的最大长度。 最大值包含在内。
maxValue param, output, type int int 整数元素的最大值。 最大值包含在内。
metadata func, output, param, type 全部 object 应用于元素的自定义属性。 可以包含与说明修饰器等效的说明属性。
minLength param, output, type 数组、字符串 int 字符串和数组元素的最小长度。 最小值包含在内。
minValue param, output, type int int 整数元素的最小值。 最小值包含在内。
sealed param, type, output object 如果用户定义的数据类型的属性名称可能存在拼写错误,则将 BCP089 从警告提升为错误。 有关详细信息,请参阅提升错误级别
secure param, type 字符串、对象 将参数标记为安全。 安全参数的值不会保存到部署历史记录中,也不会被记录下来。 有关详细信息,请参阅保护字符串和对象

参数

将参数用于需要随不同部署而变化的值。 如果在部署过程中未提供任何值,则可以为所使用的参数定义默认值。

例如,可以添加 SKU 参数以指定资源的不同大小。 根据要部署到测试还是生产,可以传递不同的值。

param storageSKU string = 'Standard_LRS'

参数可用于 Bicep 文件。

sku: {
  name: storageSKU
}

可以为每个参数添加一个或多个修饰器。 有关详细信息,请参阅使用修饰器

有关详细信息,请参阅 Bicep 中的参数

变量

要使 Bicep 文件更具可读性,可以通过将复杂的表达式封装在一个变量中。 例如,可以为资源名称添加一个变量,该名称通过将多个值连接在一起构造而成。

var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'

在需要复杂表达式的任何位置应用此变量。

resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: uniqueStorageName

可以为每个变量添加一个或多个修饰器。 有关详细信息,请参阅使用修饰器

有关详细信息,请参阅 Bicep 中的变量

类型

可以使用 type 语句来定义用户定义的数据类型。

param location string = resourceGroup().location

type storageAccountSkuType = 'Standard_LRS' | 'Standard_GRS'

type storageAccountConfigType = {
  name: string
  sku: storageAccountSkuType
}

param storageAccountConfig storageAccountConfigType = {
  name: 'storage${uniqueString(resourceGroup().id)}'
  sku: 'Standard_LRS'
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: storageAccountConfig.name
  location: location
  sku: {
    name: storageAccountConfig.sku
  }
  kind: 'StorageV2'
}

可以为每个用户定义数据类型添加一个或多个修饰器。 有关详细信息,请参阅使用修饰器

有关详细信息,请参阅 用户定义的数据类型

函数

在 Bicep 文件中,除了使用 Bicep 文件中自动提供的标准 Bicep 函数之外,也可以创建自己的函数。 当有复杂的表达式在 Bicep 文件中重复使用时,请创建自己的函数。

func buildUrl(https bool, hostname string, path string) string => '${https ? 'https' : 'http'}://${hostname}${empty(path) ? '' : '/${path}'}'

output azureUrl string = buildUrl(true, 'microsoft.com', 'azure')

有关详细信息,请参阅用户定义的函数

资源

使用关键字 resource 定义要部署的资源。 资源声明中包含资源的符号名称。 可在 Bicep 文件的其他部分使用此符号名称从资源中获取值。

资源声明中包含资源类型和 API 版本。 在资源声明的正文中,包括特定于资源类型的属性。

resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageSKU
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
  }
}

可以为每个资源添加一个或多个修饰器。 有关详细信息,请参阅使用修饰器

有关详细信息,请参阅 Bicep 中的资源声明

某些资源存在父/子关系。 可以在父资源内部或外部定义子资源。

以下示例演示如何在父资源内部定义子资源。 其中包含一个存储帐户,该存储帐户中定义了一个子资源(文件服务)。 该文件服务中也定义了一个子资源(共享)。

resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }

  resource service 'fileServices' = {
    name: 'default'

    resource share 'shares' = {
      name: 'exampleshare'
    }
  }
}

以下示例演示如何在父资源外部定义子资源。 使用 parent 属性来标识父/子关系。 定义了相同的三个资源。

resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource service 'Microsoft.Storage/storageAccounts/fileServices@2023-04-01' = {
  name: 'default'
  parent: storage
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
  name: 'exampleshare'
  parent: service
}

有关详细信息,请参阅在 Bicep 中设置子资源的名称和类型

模块

借助模块,你可以在其他 Bicep 文件中重用来自 Bicep 文件的代码。 在模块声明中,链接到要重用的文件。 部署 Bicep 文件时,也会部署模块中的资源。

module webModule './webApp.bicep' = {
  name: 'webDeploy'
  params: {
    skuName: 'S1'
    location: location
  }
}

借助符号名称,你可以从文件中的其他位置引用模块。 例如,可以通过使用符号名称和输出值的名称来获取模块的输出值。

可以为每个模块添加一个或多个修饰器。 有关详细信息,请参阅使用修饰器

有关详细信息,请参阅使用 Bicep 模块

Outputs

使用输出,以从部署中返回值。 通常,当需要将某值重新用于其他操作时,可以从已部署的资源中返回该值。

output storageEndpoint object = stg.properties.primaryEndpoints

可以为每个输出添加一个或多个修饰器。 有关详细信息,请参阅使用修饰器

有关详细信息,请参阅 Bicep 中的输出

循环

将迭代循环添加到 Bicep 文件以定义以下内容的多个副本:

  • 资源
  • 模块
  • 变量
  • 属性
  • 输出

使用 for 表达式定义循环。

param moduleCount int = 2

module stgModule './example.bicep' = [for i in range(0, moduleCount): {
  name: '${i}deployModule'
  params: {
  }
}]

可以循环访问数组、对象或整数索引。

有关详细信息,请参阅 Bicep 中的迭代循环

条件部署

可以将资源或模块添加到有条件部署的 Bicep 文件中。 在部署期间,将评估条件,并根据结果确定是部署了资源还是模块。 使用 if 表达式定义条件部署。

param deployZone bool

resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

有关详细信息,请参阅 Bicep 中的条件部署

空格

创作 Bicep 文件时将忽略空格和制表符。

Bicep 对换行敏感。 例如:

resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' = if (newOrExisting == 'new') {
  ...
}

不能写作:

resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' =
    if (newOrExisting == 'new') {
      ...
    }

在多行中定义对象数组

注释

// 用于单行注释或将 /* ... */ 用于多行注释。

以下示例演示单行注释。

// This is your primary NIC.
resource nic1 'Microsoft.Network/networkInterfaces@2023-11-01' = {
  ...
}

以下示例演示了多行注释。

/*
  This Bicep file assumes the key vault already exists and
  is in same subscription and resource group as the deployment.
*/
param existingKeyVaultName string

多行字符串

可将一个字符串分成多个行。 使用三个单引号字符 ''' 来开始和结束多行字符串。

多行字符串中的字符按原样处理。 不需要转义字符。 多行字符串中不能包含 '''。 当前不支持字符串内插。

可以在开头的 ''' 之后立即开始字符串,也可以加入新行。 无论哪种情况,生成的字符串都不包含新行。 根据 Bicep 文件中的行尾,会将新行解释为 \r\n\n

以下示例演示多行字符串。

var stringVar = '''
this is multi-line
  string with formatting
  preserved.
'''

前面的示例与以下 JSON 等效。

"variables": {
  "stringVar": "this is multi-line\r\n  string with formatting\r\n  preserved.\r\n"
}

多行声明

现在可以在函数、数组和对象声明中使用多行。 此功能需要 Bicep CLI 0.7.X 或更高版本

在以下示例中,resourceGroup() 定义分为多行。

var foo = resourceGroup(
  mySubscription,
  myRgName)

有关多行声明示例,请参阅数组对象

已知限制

  • 不支持 apiProfile 的概念(用于将单个 apiProfile 映射到每个资源类型的一组 apiVersion)。
  • 目前不支持用户定义的函数。 目前可访问试验性功能。 有关详细信息,请参阅 Bicep 中的用户定义函数
  • 有些 Bicep 功能需要对中间语言(Azure 资源管理器 JSON 模板)进行相应更改。 在所有必要的更新部署到全局 Azure 后,我们将宣布提供这些功能。 如果使用 Azure Stack 等其他环境,则该功能的可用性可能会延迟。 只有在中间语言也更新后,Bicep 功能才能在该环境中使用。