Modello di file variabile condiviso

Ridurre la ripetizione dei valori condivisi nei file Bicep. Caricare invece questi valori da un file JSON condiviso all'interno del file Bicep. Quando si usano matrici, concatenare i valori condivisi con valori specifici della distribuzione nel codice Bicep.

Contesto e problema

Quando si scrive il codice Bicep, potrebbero essere presenti variabili comuni riutilizzabili in un set di file Bicep. È possibile duplicare i valori ogni volta che si dichiara la risorsa, ad esempio copiando e incollando i valori tra i file Bicep. Tuttavia, questo approccio è soggetto a errori e, quando è necessario apportare modifiche, bisogna aggiornare ogni definizione di risorsa per mantenerla sincronizzata con le altre.

Inoltre, quando si lavora con variabili definite come matrici, è possibile avere un set di valori comuni in più file Bicep e potrebbe anche essere necessario aggiungere valori specifici per la risorsa che si sta distribuendo. Quando si combinano le variabili condivise con le variabili specifiche della risorsa, è più difficile comprendere la distinzione tra le due categorie di variabili.

Soluzione

Creare un file JSON che includa le variabili che bisogna condividere. Usare la loadJsonContent() funzione per caricare il file e accedere alle variabili. Per le variabili di matrice, usare la concat() funzione per combinare i valori condivisi con qualsiasi valore personalizzato per la risorsa specifica.

Esempio 1: Prefissi di denominazione

Supponiamo di avere più file Bicep che definiscono le risorse. È necessario usare un prefisso di denominazione coerente per tutte le risorse.

Definire un file JSON che includa i prefissi di denominazione comuni che si applicano all'interno dell'azienda:

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

Nel file Bicep dichiarare una variabile che importi i prefissi di denominazione condivisi:

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

Quando si definiscono i nomi delle risorse, usare l'interpolazione di stringhe per concatenare i prefissi di nome condiviso con suffissi di nome univoci:

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

Esempio 2: Regole del gruppo di sicurezza di rete

Supponiamo di avere più file Bicep che definiscono i propri gruppi di sicurezza di rete (NSG). È disponibile un set comune di regole di sicurezza che devono essere applicate ad ogni gruppo di sicurezza di rete e quindi si dispone di regole specifiche dell'applicazione che devono essere aggiunte.

Definire un file JSON che includa le regole di sicurezza comuni che si applicano all'interno dell'azienda:

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

Nel file Bicep dichiarare una variabile che importi le regole di sicurezza condivise:

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

Creare una matrice di variabili che rappresenti le regole personalizzate per questo gruppo di sicurezza di rete specifico:

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

Definire la risorsa del gruppo di sicurezza di rete. Usare la funzione concat() per combinare le due matrici e impostare la proprietà securityRules :

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

Considerazioni

  • Quando si usa questo approccio, il file JSON verrà incluso all'interno del modello di Resource Manager generato da Bicep. I modelli JSON ARM generati da Bicep hanno un limite di file di 4 MB, quindi è importante evitare di usare file variabili condivisi di grandi dimensioni.
  • Assicurarsi che le matrici di variabili condivise non siano in conflitto con i valori di matrice specificati in ogni file Bicep. Ad esempio, quando si usa il modello di set di configurazione per definire i gruppi di sicurezza di rete, assicurarsi di non avere più regole che definiscono la stessa priorità e la stessa direzione.

Passaggi successivi

Informazioni sul modello del set di configurazione.