配置集模式
不是定义大量单个参数,而是创建预定义值集。 在部署期间,选择要使用的值集。
上下文和问题
单个 Bicep 文件通常可定义多个资源。 每个资源可能需要根据部署到的环境使用不同的配置。 例如,你可以生成一个 Bicep 文件,用于部署应用服务计划和应用,以及存储帐户。 其中每个资源都有多个选项,这些选项会影响其成本、可用性和复原能力。 对于生产环境,需要使用一组优先考虑高可用性和复原能力的配置。 对于非生产环境,需要使用一组优先考虑成本降低问题的不同配置。
你可以为每个配置设置创建参数,但此方法存在一些缺点:
- 此方法会给模板用户带来负担,因为他们需要了解用于每个资源的值,以及设置每个参数所产生的影响。
- 模板中的参数数量会随着你定义的每个新资源的增加而上升。
- 用户可能选择未经测试或无法正常工作的参数值组合。
解决方案
创建单个参数来指定环境类型。 根据参数值,使用变量自动选择每个资源的配置。
注意
此方法有时称为 T 恤尺寸法。 当你购买 T 恤时,没有大量长度、宽度、衣袖等选项。 你只需在小、中、大尺寸之间进行选择即可,T 恤设计师已根据该尺寸预定义那些度量值。
示例
假设有一个可部署到两类环境的模板:非生产环境和生产环境。 根据环境类型,所需的配置不同:
属性 | 非生产环境 | 生产环境 |
---|---|---|
应用服务计划 | ||
SKU 名称 | S2 | P2V3 |
容量(实例数) | 1 | 3 |
应用服务应用 | ||
Always On | 已禁用 | 已启用 |
存储帐户 | ||
SKU 名称 | Standard_LRS | Standard_GRS |
你可对此模板使用配置集模式。
接受单个指示环境类型的参数,如生产或非生产环境。 使用 @allowedValues
参数修饰器确保模板用户仅提供预期值:
@allowed([
'Production'
'NonProduction'
])
param environmentType string = 'NonProduction'
然后创建映射变量,即根据环境类型定义特定配置的对象。 请注意,此变量具有两个名为 Production
和 NonProduction
的对象。 这些名称与前面示例中参数的允许值相匹配:
var environmentConfigurationMap = {
Production: {
appServicePlan: {
sku: {
name: 'P2V3'
capacity: 3
}
}
appServiceApp: {
alwaysOn: false
}
storageAccount: {
sku: {
name: 'Standard_GRS'
}
}
}
NonProduction: {
appServicePlan: {
sku: {
name: 'S2'
capacity: 1
}
}
appServiceApp: {
alwaysOn: false
}
storageAccount: {
sku: {
name: 'Standard_LRS'
}
}
}
}
定义资源时,可使用配置映射来定义资源属性:
resource appServicePlan 'Microsoft.Web/serverfarms@2020-06-01' = {
name: appServicePlanName
location: location
sku: environmentConfigurationMap[environmentType].appServicePlan.sku
}
resource appServiceApp 'Microsoft.Web/sites@2020-06-01' = {
name: appServiceAppName
location: location
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
siteConfig: {
alwaysOn: environmentConfigurationMap[environmentType].appServiceApp.alwaysOn
}
}
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
name: storageAccountName
location: location
kind: 'StorageV2'
sku: environmentConfigurationMap[environmentType].storageAccount.sku
}
注意事项
- 在映射变量中,可考虑按资源对属性分组以简化其定义。
- 在映射变量中,可定义单独的属性值(如示例中的
alwaysOn
属性),或设置对象属性的对象变量(如示例中的 SKU 属性)。 - 可考虑对资源条件使用配置集。 这样可让 Bicep 代码为特定环境部署某些资源,而不在其他环境中部署这些资源。