Шаблон файла общих переменных

Вы можете сократить число повторяющихся общих значений в файлах 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. Например, при определении групп безопасности сети с помощью шаблона набора конфигураций убедитесь, что у вас нет правил, задающих одинаковый приоритет и направление.

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

Узнайте больше о шаблоне набора конфигураций.