Bestandspatroon voor gedeelde variabelen

Verminder de herhaling van gedeelde waarden in uw Bicep-bestanden. In plaats daarvan laadt u deze waarden uit een gedeeld JSON-bestand in uw Bicep-bestand. Wanneer u matrices gebruikt, voegt u de gedeelde waarden samen met implementatiespecifieke waarden in uw Bicep-code.

Context en probleem

Wanneer u uw Bicep-code schrijft, hebt u mogelijk algemene variabelen die u opnieuw gebruikt in een set Bicep-bestanden. U kunt de waarden elke keer dupliceren wanneer u de resource declareert, bijvoorbeeld door de waarden tussen uw Bicep-bestanden te kopiëren en te plakken. Deze benadering is echter foutgevoelig en wanneer u wijzigingen moet aanbrengen, moet u elke resourcedefinitie bijwerken om deze gesynchroniseerd te houden met de andere.

Wanneer u werkt met variabelen die zijn gedefinieerd als matrices, hebt u mogelijk een set gemeenschappelijke waarden in meerdere Bicep-bestanden en moet u ook specifieke waarden toevoegen voor de resource die u implementeert. Wanneer u de gedeelde variabelen combineert met de resourcespecifieke variabelen, is het moeilijker voor iemand om het onderscheid tussen de twee categorieën variabelen te begrijpen.

Oplossing

Maak een JSON-bestand met de variabelen die u wilt delen. Gebruik de loadJsonContent() functie om het bestand te laden en toegang te krijgen tot de variabelen. Gebruik voor matrixvariabelen de concat() functie om de gedeelde waarden te combineren met aangepaste waarden voor de specifieke resource.

Voorbeeld 1: naamgevingsvoorvoegsels

Stel dat u meerdere Bicep-bestanden hebt die resources definiëren. U moet een consistent naamgevingsvoorvoegsel gebruiken voor al uw resources.

Definieer een JSON-bestand met de algemene naamgevingsvoorvoegsels die van toepassing zijn in uw bedrijf:

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

Declareer in uw Bicep-bestand een variabele waarmee de gedeelde naamgevingsvoorvoegsels worden geïmporteerd:

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

Wanneer u de resourcenamen definieert, gebruikt u tekenreeksinterpolatie om de gedeelde naamvoorvoegsels samen te voegen met unieke naamachtervoegsels:

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

Voorbeeld 2: Regels voor netwerkbeveiligingsgroepen

Stel dat u meerdere Bicep-bestanden hebt die hun eigen netwerkbeveiligingsgroepen (NSG) definiëren. U hebt een gemeenschappelijke set beveiligingsregels die moeten worden toegepast op elke NSG en vervolgens hebt u toepassingsspecifieke regels die moeten worden toegevoegd.

Definieer een JSON-bestand dat de algemene beveiligingsregels bevat die van toepassing zijn in uw hele bedrijf:

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

Declareer in uw Bicep-bestand een variabele waarmee de gedeelde beveiligingsregels worden geïmporteerd:

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

Maak een variabelematrix die de aangepaste regels voor deze specifieke NSG vertegenwoordigt:

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

Definieer de NSG-resource. Gebruik de concat() functie om de twee matrices samen te combineren en stel de eigenschap in securityRules :

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

Overwegingen

  • Wanneer u deze methode gebruikt, wordt het JSON-bestand opgenomen in de ARM-sjabloon die door Bicep is gegenereerd. De JSON ARM-sjablonen die door Bicep worden gegenereerd, hebben een bestandslimiet van 4 MB, dus het is belangrijk dat u geen grote gedeelde variabelebestanden gebruikt.
  • Zorg ervoor dat uw gedeelde variabelematrices niet conflicteren met de matrixwaarden die in elk Bicep-bestand zijn opgegeven. Wanneer u bijvoorbeeld het configuratiesetpatroon gebruikt om netwerkbeveiligingsgroepen te definiëren, moet u ervoor zorgen dat u niet meerdere regels hebt die dezelfde prioriteit en richting definiëren.

Volgende stappen

Meer informatie over het configuratiesetpatroon.