配置集模式

不是定义大量单个参数,而是创建预定义值集。 在部署期间,选择要使用的值集。

上下文和问题

单个 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'

然后创建映射变量,即根据环境类型定义特定配置的对象。 请注意,此变量具有两个名为 ProductionNonProduction 的对象。 这些名称与前面示例中参数的允许值相匹配:

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 代码为特定环境部署某些资源,而不在其他环境中部署这些资源。

后续步骤

了解共享变量文件模式。