通过使用可扩展Bicep参数文件,可以在基参数文件中定义一次参数,并在多个派生的参数文件中重复使用它们。 此方法可显著提高参数可重用性,并确保部署之间的一致性。 Bicep CLI 版本 0.44.1 及更高版本支持扩展参数文件以及extendsbase关键字。
派生参数文件只能扩展一个基参数文件。 它只能包含一个 extends 语句。 但是,您可以通过在多个文件之间链式使用扩展来创建嵌套参数文件。 有关详细信息,请参阅 嵌套参数文件。
该 extends 语句仅继承参数赋值。
- 可以在基参数文件中定义 变量 来计算其参数值,但这些变量不会公开给派生的参数文件。
- 可以在参数文件中定义 用户定义的类型 。 还可以导入在 Bicep 文件中定义的用户自定义类型。 但是,这些用户定义的类型不会向派生的参数文件公开。
- 不能直接在参数文件中声明 用户定义的函数 。 但是,可以将它们 导入 到参数文件中。 这些函数不会向派生的参数文件公开。
扩展参数文件
默认情况下,在派生参数文件中定义的参数完全覆盖基参数文件中的参数。 若要合并而不是覆盖,请使用具有对象或数组分布语法的 base 关键字。 有关详细信息,请参阅 Access 父参数。
使用基参数文件中的using none语句指示编译器不要针对任何特定的Bicep文件绑定或验证它们。
以下示例演示如何在 Bicep 中使用可扩展参数文件。
你的主要 Bicep 模板main.bicep定义了部署可接受的参数。
param namePrefix string
param location string
param tags object
一个基参数文件, base.bicepparam可以在多个部署和环境之间重复使用该文件。
using none
// Notice that the first line of this .bicepparam file declares `using none` which tells the compiler not to validate this against any particular .bicep file.
param namePrefix = 'Prod'
param location = 'westus'
param tags = {
environment: 'dev'
owner: 'platform'
}
基于基础参数文件构建的扩展参数文件 derived.bicepparam。 它同时引用了 Bicep 文件和基础参数文件。 此处定义的值将替代前面的值。
using 'main.bicep'
extends 'base.bicepparam'
param namePrefix = 'Dev'
param tags = {
...base.tags // inherit the object from the base file
environment: 'prod' // override a single property
region: 'westus2' // add new data
}
在此示例中,参数值在具有明确优先级顺序的层中应用。 该文件 main.bicep 声明参数,并提供默认值。
派生.bicepparam文件可以替代基.bicepparam文件中定义的值,最终分配的参数值优先于目标模板中定义的任何默认值。 解析的值包括:
| 参数 | 价值 |
|---|---|
| namePrefix | 'Dev' |
| 位置 | 'westus' |
| 标签 | { environment: 'prod', owner: 'platform', region: 'westus2' } |
获取父级参数
若要使用 base 关键字,派生参数文件必须包含子 extends 句。 此子句以 base 标识符的形式解锁,因此你可以以属性的形式访问所有父参数。 如果你试图在没有 base 子句的情况下使用 extends,就会报错。
你可以将 展开运算符(...) 与 base 结合使用,以轻松扩展或合并复杂数据类型。 此方法允许从父文件复制现有数组或对象值,并对其进行修改,而无需重新设置整个数据结构。 分散运算符严格限制为对象和数组。 如果尝试传播基元值(如字符串、整数或布尔值),则会导致编译失败。
所有覆盖后的值都必须与目标参数所要求的确切数据类型完全匹配。 提供不兼容的类型会导致编译期间出现类型错误。
Bicep 文件 main.bicep:
param app object
param locations array
param fullName string
基参数文件 base.bicepparam:
using none
param app = {
name: 'demo'
tags: {
owner: 'platform'
environment: 'dev'
}
}
param locations = ['westus', 'eastus']
派生参数文件 derived.bicepparam:
using './main.bicep'
extends './base.bicepparam'
// Merge objects
param app = {
...base.app
tags: {
...base.app.tags
environment: 'prod'
costCenter: '1234'
}
}
// Merge arrays
param locations = [...base.locations, 'centralus']
// Use base in expressions or variables
var suffix = '-api'
param fullName = '${base.app.name}${suffix}'
解析的值包括:
| 参数 | 价值 |
|---|---|
| 应用 | {"name":"demo","tags":{"owner":"platform","environment":"prod","costCenter":"1234"}} |
| locations | ["westus","eastus","centralus"] |
| fullName | demo-api |
嵌套参数文件
虽然派生参数文件只能包含单个extends语句,但Bicep允许按顺序链接参数文件(参数文件 A $\rightarrow$ 参数文件 B $\rightarrow$ 参数文件 C)来生成多层次层次结构。
此结构可用于组织企业部署。 可以在根目录中定义全局默认值,替代中间层中的环境范围设置,并在叶级别指定本地化的资源特定配置。
生成链时,序列中的任何中间或根参数文件都必须包含 using none 该语句。 此语句向Bicep编译器发出信号,该文件严格充当配置层,并且不会直接绑定到特定的.bicep部署模板。
以下示例演示如何设置三层链来配置Azure资源布局,从全局组织设置向下移动到特定的本地化开发环境。
Bicep 文件(compute.bicep)
param primaryLocation string
param globalTags object
param environmentTags object
param resourceTags object
param skuName string
param vmSku string
param vmName string
...
根层:全局默认值(global.bicepparam) 建立整个组织中使用的基线属性。 之所以使用 using none,是因为它仅作为配置基础。
using none
// Global baseline tags applied to every single resource
param globalTags = {
BillingUnit: 'Enterprise-IT'
DataClassification: 'Confidential'
}
// Default regional pair
param primaryLocation = 'eastus'
中间层:环境设置 (dev-defaults.bicepparam) 继承全局属性、替代环境类型,并追加特定于环境的配置。 因为它是中间层,因此也使用 using none。
using none
extends './global.bicepparam'
// Inherit global tags and inject the environment designation
param environmentTags = {
...base.globalTags
Environment: 'Development'
}
// Override region for low-cost development testing
param primaryLocation = 'westus'
// Tier-specific infrastructure sizes
param skuName = 'Standard_D2s_v5'
叶层:目标部署(compute.dev.bicepparam) 面向特定的工作负荷部署。 它通过标准的 using 语句直接连接到实际的 Bicep 基础设施模板,并继承该链的整个合并状态。
extends './dev-defaults.bicepparam'
using './compute.bicep' // Binds the final resolved values to the template
// Combine all inherited layers into the final parameters expected by compute.bicep
param resourceTags = {
...base.environmentTags
Workload: 'Web-FrontEnd'
}
// Use inherited environment SKU directly, or override it if needed
param vmSku = base.skuName
// Explicit deployment property
param vmName = 'vm-web-dev-01'
相关内容
- 若要了解Bicep参数文件,请参阅Bicep参数文件。
- 若要了解
using和using none,请参阅 using 语句和 using none 语句。 - 若要了解分散运算符,请参阅 Spread 运算符。