Поделиться через


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

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

Дальнейшие шаги

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