Шаблон набора конфигурации

Вместо того чтобы определять множество отдельных параметров, вы можете создавать предопределенные наборы значений. Во время развертывания выберите используемый набор значений.

Контекст и проблема

В одном файле Bicep часто определяется множество ресурсов. Каждому ресурсу может потребоваться использовать отдельную конфигурацию, в зависимости от того, в какой среде он развертывается. Например, вы можете создать файл Bicep, который развертывает приложение и план службы приложений, а также учетную запись хранения. Каждый из этих ресурсов содержит ряд параметров, от которых зависят его стоимость, доступность и устойчивость. Для рабочих сред рекомендуем использовать один набор конфигурации, где приоритет отдается высоким уровням доступности и устойчивости. Для нерабочих сред рекомендуем использовать другой набор конфигурации, где приоритет отдается сокращению расходов.

Вы можете создать параметры для каждой опции конфигурации, но у этого подхода есть некоторые недостатки.

  • Этот подход усложняет работу пользователей шаблонов, так как им нужно понимать, какие значения использовать для каждого ресурса, и увеличивает влияние настройки каждого параметра.
  • Количество параметров в шаблоне увеличивается с каждым новым определенным ресурсом.
  • Пользователи могут выбрать сочетания значений параметров, которые не были протестированы или не работают надлежащим образом.

Решение

Создайте один параметр, указывающий тип среды. Используйте переменную для автоматического выбора конфигурации каждого ресурса в соответствии со значением параметра.

Примечание

Этот подход иногда называют “размер футболки” . При покупке футболки вы не выбираете множество параметров, таких как длина, ширина, рукава и т. д. Вы просто выбираете малый, средний или крупный размер, для которых дизайнер определил эти параметры.

Пример

Допустим, у вас есть шаблон, который можно развернуть в средах двух типов: нерабочих и рабочих. Нужная конфигурация выбирается в зависимости от типа среды:

Свойство Нерабочие среды Рабочих сред
План обслуживания приложения
Номер SKU S2 P2V3
Емкость (количество экземпляров) 1 3
Приложение службы приложений
Всегда включено Выключено Активировано
Учетная запись хранения
Номер SKU Standard_LRS Standard_ZRS

Вы можете использовать шаблон набора конфигурации для этого примера.

Примите один параметр, указывающий тип среды, например рабочую или нерабочую. Используйте декоратор параметра @allowed, чтобы гарантировать, что пользователи шаблона предоставляют только ожидаемые значения.

@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_ZRS'
      }
    }
  }
  NonProduction: {
    appServicePlan: {
      sku: {
        name: 'S2'
        capacity: 1
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_LRS'
      }
    }
  }
}

При определении ресурсов используйте сопоставление конфигурации, чтобы определить свойства ресурсов:

resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: appServicePlanName
  location: location
  sku: environmentConfigurationMap[environmentType].appServicePlan.sku
}

resource appServiceApp 'Microsoft.Web/sites@2022-09-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      alwaysOn: environmentConfigurationMap[environmentType].appServiceApp.alwaysOn
    }
  }
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: environmentConfigurationMap[environmentType].storageAccount.sku
}

Рекомендации

  • В переменной сопоставления рекомендуем группировать свойства по ресурсу, чтобы упростить их определение.
  • В переменной сопоставления можно определить как значения отдельных свойств (например, свойства alwaysOn в нашем примере), так и объектные переменные, которые задают свойства объектов (например, свойства SKU в нашем примере).
  • Рекомендуем использовать набор конфигурации с условиями ресурсов. Благодаря этому код Bicep может развертывать определенные ресурсы для конкретных сред, не развертывая их в других.

Следующие шаги

Сведения о шаблоне файла общих переменных.