Шаблон файла общих переменных
Вы можете сократить число повторяющихся общих значений в файлах Bicep. Вместо этого загрузите их из общего JSON-файла в файл Bicep. При использовании массивов объедините в коде Bicep общие значения со значениями, зависящими от развертывания.
Контекст и проблема
У вас в коде Bicep могут быть стандартные переменные, которые повторно используются в наборе файлов Bicep. Значения можно дублировать при каждом объявлении ресурса, например путем копирования и вставки между файлами Bicep. Однако этот подход чреват ошибками, и если необходимо внести изменения, потребуется обновить каждое определение ресурса, чтобы все было одинаково.
Более того, при работе с переменными, определенными как массивы, в нескольких файлах Bicep может быть набор общих значений, а кроме того, бывает нужно добавить определенные значения для развертываемого ресурса. Когда общие переменные смешиваются с переменными, зависящими от ресурса, бывает трудно понять различие между двумя этими категориями.
Решение
Создайте JSON-файл, содержащий ваши общие переменные. Используйте функцию loadJsonContent()
функция, чтобы загрузить файл и получить доступ к переменным. Для переменных массива используйте функцию concat()
, позволяющую объединить общие значения с пользовательскими значениями для определенного ресурса.
Пример 1. Префиксы именования
Предположим, что у вас есть несколько файлов Bicep, в которых определяются ресурсы. Для всех ресурсов необходимо использовать последовательный префикс именования.
Создайте JSON-файл, который содержит общие префиксы именования, применяемые в вашей компании:
{
"storageAccountPrefix": "stg",
"appServicePrefix": "app"
}
В файле Bicep объявите переменную, которая импортирует общие префиксы именования:
var sharedNamePrefixes = loadJsonContent('./shared-prefixes.json')
При определении имен ресурсов используйте интерполяцию строк для сцепления префиксов общего имени с уникальными суффиксами имен:
var appServiceAppName = '${sharedNamePrefixes.appServicePrefix}-myapp-${uniqueString(resourceGroup().id)}'
var storageAccountName = '${sharedNamePrefixes.storageAccountPrefix}myapp${uniqueString(resourceGroup().id)}'
Пример 2. Правила группы безопасности сети
Предположим, у вас есть несколько файлов Bicep, которые определяют собственные группы безопасности сети (NSG). Имеется общий набор правил безопасности, которые должны применяться к каждой NSG, а также необходимы правила для конкретных приложений.
Создайте JSON-файл, который содержит общие правила безопасности, применяемые в вашей компании:
{
"securityRules": [
{
"name": "Allow_RDP_from_company_IP_address",
"properties": {
"description": "Allow inbound RDP from the company's IP address range.",
"protocol": "Tcp",
"sourceAddressPrefix": "203.0.113.0/24",
"sourcePortRange": "*",
"destinationAddressPrefix": "VirtualNetwork",
"destinationPortRange": "3389",
"access": "Allow",
"priority": 100,
"direction": "Inbound"
}
},
{
"name": "Allow_VirtualNetwork_to_Storage",
"properties": {
"description": "Allow outbound connections to the Azure Storage service tag.",
"protocol": "Tcp",
"sourceAddressPrefix": "VirtualNetwork",
"sourcePortRange": "*",
"destinationAddressPrefix": "Storage",
"destinationPortRange": "*",
"access": "Allow",
"priority": 100,
"direction": "Outbound"
}
}
// other rules here
]
}
В файле Bicep объявите переменную, которая импортирует общие правила безопасности:
var sharedRules = loadJsonContent('./shared-rules.json', 'securityRules')
Создайте массив переменных, представляющий настраиваемые правила для конкретной NSG:
var customRules = [
{
name: 'Allow_Internet_HTTPS_Inbound'
properties: {
description: 'Allow inbound internet connectivity for HTTPS only.'
protocol: 'Tcp'
sourcePortRange: '*'
destinationPortRange: '443'
sourceAddressPrefix: 'Internet'
destinationAddressPrefix: 'VirtualNetwork'
access: 'Allow'
priority: 400
direction: 'Inbound'
}
}
]
Определите ресурс NSG. С помощью функции concat()
объедините два массива и задайте свойство securityRules
:
resource nsg 'Microsoft.Network/networkSecurityGroups@2021-08-01' = {
name: nsgName
location: location
properties: {
securityRules: concat(sharedRules, customRules)
}
}
Рекомендации
- При использовании такого подхода JSON файл включается в шаблон ARM, создаваемый Bicep. Создаваемые Bicep JSON-шаблоны ARM имеют предельный размер файла в 4 МБ, поэтому не следует использовать большие файлы общих переменных.
- Общие переменные массивов не должны конфликтовать со значениями массивов, указанными в каждом файле Bicep. Например, при определении групп безопасности сети с помощью шаблона набора конфигураций убедитесь, что у вас нет правил, задающих одинаковый приоритет и направление.