Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Уменьшите повторение общих значений в файлах 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. Шаблоны JSON ARM, созданные Bicep, имеют ограничение в 4 МБ, поэтому важно избегать использования больших общих файлов переменных.
- Убедитесь, что общие массивы переменных не конфликтуют со значениями массивов, указанными в каждом файле Bicep. Например, при использовании шаблона набора конфигураций для определения групп безопасности сети убедитесь, что у вас нет нескольких правил, определяющих одинаковый приоритет и направление.