Добавьте гибкости, используя параметры и переменные
Шаблоны мощны из-за их многократного использования. Вы можете использовать Bicep для написания шаблонов, которые развертывают несколько сред или копий ваших ресурсов.
Ваша компания регулярно запускает новые продукты, и вам нужно использовать шаблоны Bicep для создания ресурсов Azure, необходимых для каждого запуска продукта. Вам нужно избегать использования фиксированных имен ресурсов. Многим типам ресурсов Azure требуются уникальные имена, поэтому при внедрении имен в шаблон вы не сможете повторно использовать его для запуска других продуктов. Вам также необходимо развернуть ресурсы в разных местах в зависимости от того, где будут запускаться игрушки, что означает, что вы также не можете встроить местоположения ресурсов в свой шаблон.
В этом модуле вы узнаете о параметрах и переменных, которые представляют собой две функции Bicep, которые могут сделать ваши шаблоны гибкими и многоразовыми. Вы также познакомитесь с выражениями.
Примечание.
Команды в этом уроке демонстрируют основные понятия. На этом этапе не выполняйте команды. Вскоре вы поупражняетесь с полученными знаниями.
Параметры и переменные
Параметр позволяет вводить значения извне файла шаблона. Например, если вы вручную развертываете шаблон с помощью Azure CLI или Azure PowerShell, вам будет предложено указать значения для каждого параметра. Вы также можете создать файл параметров, который содержит список всех параметров и значений, которые вы хотите использовать для развертывания. Если шаблон развертывается из автоматизированного процесса, такого как конвейер развертывания, конвейер может предоставить значения параметров.
Переменная определяется и устанавливается в шаблоне. Переменные позволяют постоянно хранить важную информацию и ссылаться на нее по всему шаблону без необходимости ее копирования и вставки.
Обычно рекомендуется использовать параметры для вещей, которые будут меняться между каждым развертыванием, например:
- Имена ресурсов, которые должны быть уникальными.
- Расположения, в которые необходимо развернуть ресурсы.
- Параметры, которые влияют на ценообразование ресурсов, например их артикулы, уровни ценообразования и количество экземпляров.
- Учетные данные и информация, необходимые для доступа к другим системам, которые не определены в шаблоне.
Переменные обычно являются хорошим вариантом, если вы будете использовать одинаковые значения для каждого развертывания, но вы хотите повторно использовать значение в шаблоне или когда вы хотите использовать выражения для создания сложного значения. Можно также использовать переменные для ресурсов, которые не нуждаются в уникальных именах.
Совет
Важно использовать правильное именование параметров и переменных, чтобы ваши шаблоны были легкими для чтения и понимания. Убедитесь, что вы используете ясные, информативные и последовательные имена.
Добавление параметра
В Bicep вы можете определить такой параметр:
param appServiceAppName string
Давайте посмотрим, как работает каждая часть этого определения:
param
сообщает Bicep, что вы определяете параметр.appServiceAppName
— это имя параметра. Если вы развертываете шаблон вручную, вам может потребоваться ввести значение, поэтому важно, чтобы имя было понятным и понятным. Имя — это также то, как вы ссылаетесь на значение параметра в шаблоне, как и в случае с символическими именами ресурсов.string
— это тип параметра. Можно указать несколько различных типов для параметров Bicep, в том числеstring
для текста,int
чисел, аbool
также для логических или ложных значений. Вы также можете передавать более сложные параметры, используя типыarray
иobject
.
Совет
Старайтесь не обобщать шаблоны, используя слишком много параметров. Используйте столько параметров, сколько минимально необходимо для вашего бизнес-сценария. Помните, что если требования изменятся, шаблоны всегда можно изменить.
Укажите значения по умолчанию
При желании вы можете указать значение по умолчанию для параметра. При указании значения по умолчанию параметр становится необязательным. Пользователь, который развертывает шаблон, может указать значение, если они хотят, но если они этого не сделали, Bicep использует значение по умолчанию.
Вот как можно добавить значение по умолчанию:
param appServiceAppName string = 'toy-product-launch-1'
Примечание.
В этом примере имя приложения службы приложений Azure имеет жестко заданное значение по умолчанию. Это плохая идея, потому что приложениям службы приложений нужны уникальные имена. Вы скоро это исправите.
Использовать значения параметров в шаблоне
После того как вы объявили параметр, вы можете ссылаться на него в остальной части шаблона. Давайте посмотрим, как вы можете использовать свой новый параметр в определении ресурса.
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = {
name: appServiceAppName
location: 'eastus'
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
Обратите внимание, что шаблон теперь использует значение параметра для задания имени ресурса для ресурса приложения вместо жестко закодированного значения.
Совет
Расширение Bicep для Visual Studio Code содержит визуальные индикаторы, дающие знать, когда вы не следуете рекомендуемым принципам. Например, при определении неиспользуемого параметра появляется предупреждение. Анализатор кода Bicep постоянно выполняет эти проверки во время работы.
Добавление переменной
Вы можете определить такую переменную:
var appServicePlanName = 'toy-product-launch-plan'
Переменные определяются аналогично параметрам, но с некоторыми отличиями:
- Используйте ключевое слово
var
, чтобы сообщить Bicep, что вы объявляете переменную. - Вы должны указать значение переменной.
- Переменным не нужны типы. Bicep может определить тип на основе заданного значения.
Выражения
При написании шаблонов лучше не использовать жестко заданные в коде значения и даже не указывать их в параметрах. Вместо этого вы хотите обнаруживать значения при запуске шаблона. Например, вы наверняка захотите развернуть все ресурсы шаблона в одном регионе Azure, в котором вы создали группу ресурсов. Или вам может быть нужно автоматически создать для ресурса уникальное имя, соответствующее корпоративной стратегии именования.
Выражения в Bicep — это мощная функция, которая помогает справляться со всевозможными интересными сценариями. Давайте взглянем на несколько мест, где вы можете использовать выражения в шаблоне Bicep.
Расположение ресурсов
Когда вы пишете и развертываете шаблон, вам часто не нужно указывать расположение каждого ресурса по отдельности. Вместо этого может быть простое бизнес-правило, которое говорит, по умолчанию, развертывать все ресурсы в том же расположении, в котором была создана группа ресурсов.
Bicep позволяет создать параметр с именем location
и задать его значение с помощью выражения:
param location string = resourceGroup().location
Посмотрите на значение этого параметра по умолчанию. Она использует функцию с именем resourceGroup()
, которая предоставляет доступ к сведениям о группе ресурсов, в которой развертывается шаблон. В этом примере шаблон использует свойство location
. Обычно этот подход используется для развертывания ресурсов в том же регионе Azure, где развернута группа.
Если кто-то развертывает этот шаблон, он может изменить здесь значение по умолчанию и использовать другое расположение.
Примечание.
Некоторые ресурсы Azure можно развертывать только в определенных местах. Вам могут потребоваться отдельные параметры для определения местоположения этих ресурсов.
Теперь вы можете использовать параметр местоположения ресурса внутри шаблона, например:
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = {
name: appServiceAppName
location: location
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
Имена ресурсов
Многим ресурсам Azure нужны уникальные имена. В вашем сценарии у вас есть два ресурса, которым нужны уникальные имена: учетная запись хранения и приложение службы приложений. Запрос на установку этих значений в качестве параметров может затруднить использование шаблона, поскольку им нужно найти имя, которое никто другой не использовал.
В Bicep есть еще одна функция под названием uniqueString()
, которая может пригодиться при создании имен ресурсов. При использовании этой функции необходимо указать начальное значение, которое должно отличаться в разных развертываниях, но согласовано во всех развертываниях для одного и того же ресурса.
Если вы выбираете хорошее начальное значение, вы можете получить то же имя при каждом развертывании одного набора ресурсов, но при развертывании другого набора ресурсов при развертывании другого набора ресурсов с помощью одного шаблона. Давайте посмотрим, как можно использовать функцию uniqueString()
:
param storageAccountName string = uniqueString(resourceGroup().id)
Значение этого параметра по умолчанию снова использует функцию resourceGroup()
, как и при установке местоположения ресурса. Однако на этот раз вы получите идентификатор группы ресурсов. Вот как выглядит идентификатор группы ресурсов:
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MyResourceGroup
Идентификатор группы ресурсов включает идентификатор подписки Azure (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
) и имя группы ресурсов (MyResourceGroup
). Идентификатор группы ресурсов часто является хорошим кандидатом в качестве начального значения для имен ресурсов, потому что:
- Каждый раз, когда вы развертываете одни и те же ресурсы, они попадают в одну и ту же группу ресурсов. Функция
uniqueString()
будет каждый раз возвращать одно и то же значение. - При развертывании в двух разных группах ресурсов в подписке Azure значение
resourceGroup().id
будет различаться, так как у групп ресурсов разные имена. ФункцияuniqueString()
будет давать разные значения для каждого набора ресурсов. - Если вы выполняете развертывание в двух разных подписках Azure, даже если вы используете одно и то же имя группы ресурсов, значение
resourceGroup().id
будет другим, потому что идентификатор подписки Azure будет другим. ФункцияuniqueString()
будет снова давать разные значения для каждого набора ресурсов.
Совет
Часто рекомендуется использовать выражения шаблона для создания имен ресурсов. Многие типы ресурсов Azure имеют правила о разрешенных символах и длине их имен. Внедрение создания имен ресурсов в шаблон означает, что любой, кто использует шаблон, не должен помнить о том, что сам следует этим правилам.
Объединенные строки
Если просто использовать функцию uniqueString()
для задания имен ресурсов, то вы, скорее всего, получите уникальные имена, но они не будут иметь смысла. Хорошее имя ресурса также должно быть описательным, чтобы было ясно, для чего ресурс предназначен. Часто вам нужно создать имя, объединив значащее слово или строку с уникальным значением. Таким образом, у вас будут ресурсы с осмысленными уникальными именами и .
Bicep имеет функцию, называемую интерполяцией строк, которая позволяет комбинировать строки. Давайте посмотрим, как это работает:
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
Значение по умолчанию для параметра storageAccountName
теперь состоит из двух частей:
toylaunch
— это жестко закодированная строка, которая помогает любому, кто смотрит на развернутый ресурс в Azure, чтобы понять назначение учетной записи хранения.${uniqueString(resourceGroup().id)}
— это указывает Bicep получить результат функцииuniqueString(resourceGroup().id)
и сцепить его со строкой.
Совет
Иногда функция uniqueString()
создает строки, начинающиеся с числа. Для некоторых ресурсов Azure, например учетных записей хранения, имена не могут начинаться с цифр. Это означает, что для создания имен ресурсов рекомендуется использовать строковую интерполяцию, как в предыдущем примере.
Выбор SKU для ресурсов
Другие члены вашей команды впечатлены кодом Bicep, который вы создали до сих пор. Вы решили вместе, что вы будете использовать шаблон для развертывания ресурсов для поддержки всех новых запусков токов.
Один из ваших коллег предложил вам создавать непроизводственные среды для каждого запуска продукта, чтобы помочь маркетинговой группе тестировать сайты перед тем, как они станут доступны для клиентов. Тем не менее, вы хотите убедиться, что вы не тратите слишком много денег на ваши нерабочие среды, поэтому вы решите о некоторых политиках вместе:
- В производственных средах учетные записи хранения будут развернуты в SKU
Standard_GRS
(геоизбыточное хранилище) для повышения отказоустойчивости. Планы службы приложений будут развернуты в SKUP2v3
для повышения производительности. - В непроизводственных средах учетные записи хранения будут развернуты в
Standard_LRS
SKU (локально избыточное хранилище). Планы службы приложений будут развернуты с бесплатным SKUF1
.
Один из способов реализовать эти бизнес-требования — использовать параметры для указания каждого SKU. Однако указание каждого номера SKU в качестве параметра может стать трудным для управления, особенно если у вас есть более крупные шаблоны. Другой вариант — встроить бизнес-правила в шаблон, используя комбинацию параметров, переменных и выражений.
Во-первых, вы можете указать параметр, который указывает, предназначено ли развертывание для производственной или непроизводственной среды:
@allowed([
'nonprod'
'prod'
])
param environmentType string
Обратите внимание, что в этом коде используется новый синтаксис для указания списка допустимых значений параметра environmentType
. Bicep не позволит никому развернуть шаблон, если они не предоставят одно из этих значений.
Затем вы можете создать переменные, которые определяют номера SKU, которые будут использоваться для учетной записи хранения и плана службы приложений, в зависимости от среды:
var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2V3' : 'F1'
Обратите внимание и на новый синтаксис. Давайте разберемся:
(environmentType == 'prod')
вычисляется логическое значение (true или false), в зависимости от того, какое допустимое значение используется дляenvironmentType
параметра.?
называется тернарным оператором и вычисляетif/then
оператор. Значение после?
использования оператора, если выражение имеет значение true. Если выражение выдаст результат false (ложь), то используется значение после двоеточия (:
).
Мы можем перевести эти правила в следующее:
- Для
storageAccountSkuName
переменной, еслиenvironmentType
параметр имеет значениеprod
, используйтеStandard_GRS
SKU. В противном случае используйтеStandard_LRS
SKU. - Для переменной
appServicePlanSkuName
, если для параметраenvironmentType
задано значениеprod
, используйтеP2V3
SKU и уровеньPremiumV3
. В противном случае используйтеF1
SKU.
Совет
При создании таких многопартийных выражений лучше всего использовать переменные, а не внедрять выражения непосредственно в свойства ресурса. Это упрощает чтение и понимание ваших шаблонов, поскольку позволяет избежать загромождения определений ресурсов логикой.
При использовании параметров, переменных и выражений в шаблоне можно повторно использовать шаблон и быстро развертывать новый набор ресурсов. Например, каждый раз, когда отдел маркетинга запрашивает развертывание нового веб-сайта для следующего запуска, вы предоставляете новые значения параметров для каждой развернутой среды, и вы будете заданы!