Patrón de archivo de variables compartido

Reduzca la repetición de valores compartidos en los archivos Bicep. En su lugar, cargue esos valores desde un archivo JSON compartido dentro del archivo Bicep. Al usar matrices, concatene los valores compartidos con valores específicos de la implementación en el código Bicep.

Contexto y problema

Al escribir el código de Bicep, es posible que tenga variables comunes que se reutilizan en un conjunto de archivos Bicep. Puede duplicar los valores cada vez que declara el recurso, por ejemplo, copiando y pegando los valores entre los archivos Bicep. Sin embargo, este enfoque es propenso a errores y, cuando necesite realizar cambios, deberá actualizar cada definición de recurso para mantenerla sincronizada con las demás.

Además, al trabajar con variables definidas como matrices, es posible que tenga un conjunto de valores comunes en varios archivos Bicep y que también necesite agregar valores específicos para el recurso que va a implementar. Cuando se mezclan las variables compartidas con las variables específicas del recurso, es más difícil que alguien comprenda la distinción entre las dos categorías de variables.

Solución

Cree un archivo JSON que incluya las variables que necesita compartir. Use la loadJsonContent()función para cargar el archivo y acceder a las variables. Para las variables de matriz, use la función concat() para combinar los valores compartidos con cualquier valor personalizado para el recurso específico.

Ejemplo 1: nomenclatura de prefijos

Supongamos que tiene varios archivos Bicep que definen recursos. Debe usar un prefijo de nomenclatura coherente para todos los recursos.

Defina un archivo JSON que incluya los prefijos de nomenclatura comunes que se aplican en toda la empresa:

{
  "storageAccountPrefix": "stg",
  "appServicePrefix": "app"
}

En el archivo Bicep, declare una variable que importe los prefijos de nomenclatura compartidos:

var sharedNamePrefixes = loadJsonContent('./shared-prefixes.json')

Al definir los nombres de recursos, use la interpolación de cadenas para concatenar los prefijos de nombre compartido con sufijos de nombre únicos:

var appServiceAppName = '${sharedNamePrefixes.appServicePrefix}-myapp-${uniqueString(resourceGroup().id)}'
var storageAccountName = '${sharedNamePrefixes.storageAccountPrefix}myapp${uniqueString(resourceGroup().id)}'

Ejemplo 2: reglas del grupo de seguridad de red

Supongamos que tiene varios archivos Bicep que definen sus propios grupos de seguridad de red (NSG). Tiene un conjunto común de reglas de seguridad que se deben aplicar a cada grupo de seguridad de red y, a continuación, tiene reglas específicas de la aplicación que se deben agregar.

Defina un archivo JSON que incluya las reglas de seguridad comunes que se aplican en toda la empresa:

{
  "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
  ]
}

En el archivo Bicep, declare una variable que importe las reglas de seguridad compartidas:

var sharedRules = loadJsonContent('./shared-rules.json', 'securityRules')

Cree una matriz de variables que represente las reglas personalizadas para este NSG específico:

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'
    }
  }
]

Defina el recurso de NSG. Use la función concat() para combinar las dos matrices y establecer la propiedad securityRules:

resource nsg 'Microsoft.Network/networkSecurityGroups@2021-08-01' = {
  name: nsgName
  location: location
  properties: {
    securityRules: concat(sharedRules, customRules)
  }
}

Consideraciones

  • Al usar este enfoque, el archivo JSON se incluirá dentro de la plantilla de ARM generada por Bicep. Las plantillas de ARM JSON generadas por Bicep tienen un límite de archivos de 4 MB, por lo que es importante evitar el uso de archivos de variables compartidas de gran tamaño.
  • Asegúrese de que las matrices de variables compartidas no entren en conflicto con los valores de matriz especificados en cada archivo Bicep. Por ejemplo, al usar el patrón de conjunto de configuración para definir grupos de seguridad de red, asegúrese de que no tiene varias reglas que definan la misma prioridad y dirección.

Pasos siguientes

Más información acerca del patrón de conjunto de configuración.