Delen via


Patroon gedeelde variabelebestand

Verminder de herhaling van gedeelde waarden in uw Bicep-bestanden. Laad in plaats daarvan 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 dupliceren telkens 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.

Als u werkt met variabelen die zijn gedefinieerd als matrices, hebt u mogelijk een set algemene waarden voor 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. Voor matrixvariabelen gebruikt u de concat() functie om de gedeelde waarden te combineren met eventuele 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 dat de algemene naamgevingsvoorvoegsels bevat 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 algemene 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 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 te combineren en de securityRules eigenschap in te stellen:

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 wordt gegenereerd. De JSON ARM-sjablonen die door Bicep worden gegenereerd, hebben een bestandslimiet van 4 MB, dus het is belangrijk om te voorkomen dat grote gedeelde variabelebestanden worden gebruikt.
  • Zorg ervoor dat uw gedeelde variabelematrices niet conflicteren met de matrixwaarden die zijn opgegeven in elk Bicep-bestand. Als u bijvoorbeeld het patroon voor de configuratieset 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 patroon van de configuratieset.