Mönster för delad variabelfil

Minska upprepningen av delade värden i dina Bicep-filer. Läs i stället in dessa värden från en delad JSON-fil i Bicep-filen. När du använder matriser sammanfogar du de delade värdena med distributionsspecifika värden i Bicep-koden.

Kontext och problem

När du skriver Bicep-koden kan du ha vanliga variabler som du återanvänder i en uppsättning Bicep-filer. Du kan duplicera värdena varje gång du deklarerar resursen, till exempel genom att kopiera och klistra in värdena mellan dina Bicep-filer. Den här metoden är dock felbenägen och när du behöver göra ändringar måste du uppdatera varje resursdefinition för att hålla den synkroniserad med de andra.

När du arbetar med variabler som definierats som matriser kan du dessutom ha en uppsättning gemensamma värden för flera Bicep-filer och även behöva lägga till specifika värden för den resurs som du distribuerar. När du blandar de delade variablerna med resursspecifika variabler är det svårare för någon att förstå skillnaden mellan de två variabelkategorierna.

Lösning

Skapa en JSON-fil som innehåller de variabler som du behöver dela. loadJsonContent() Använd funktionen för att läsa in filen och komma åt variablerna. För matrisvariabler använder du concat() funktionen för att kombinera delade värden med anpassade värden för den specifika resursen.

Exempel 1: Namngivningsprefix

Anta att du har flera Bicep-filer som definierar resurser. Du måste använda ett konsekvent namngivningsprefix för alla dina resurser.

Definiera en JSON-fil som innehåller vanliga namngivningsprefix som gäller i hela företaget:

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

I Bicep-filen deklarerar du en variabel som importerar prefixen för delad namngivning:

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

När du definierar resursnamnen använder du stränginterpolation för att sammanfoga de delade namnprefixen med unika namnsuffix:

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

Exempel 2: Regler för nätverkssäkerhetsgrupper

Anta att du har flera Bicep-filer som definierar sina egna nätverkssäkerhetsgrupper (NSG). Du har en gemensam uppsättning säkerhetsregler som måste tillämpas på varje NSG och sedan har du programspecifika regler som måste läggas till.

Definiera en JSON-fil som innehåller vanliga säkerhetsregler som gäller i hela företaget:

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

I Bicep-filen deklarerar du en variabel som importerar de delade säkerhetsreglerna:

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

Skapa en variabelmatris som representerar de anpassade reglerna för den här specifika NSG:n:

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

Definiera NSG-resursen. concat() Använd funktionen för att kombinera de två matriserna och ange securityRules egenskapen :

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

Överväganden

  • När du använder den här metoden inkluderas JSON-filen i ARM-mallen som genereras av Bicep. JSON ARM-mallarna som genereras av Bicep har en filgräns på 4 MB, så det är viktigt att undvika att använda stora delade variabelfiler.
  • Se till att dina delade variabelmatriser inte är i konflikt med de matrisvärden som anges i varje Bicep-fil. När du till exempel använder konfigurationsuppsättningsmönstret för att definiera nätverkssäkerhetsgrupper kontrollerar du att du inte har flera regler som definierar samma prioritet och riktning.

Nästa steg

Läs mer om konfigurationsuppsättningsmönstret.