Bestandspatroon voor gedeelde variabelen

Verminder de herhaling van gedeelde waarden in uw Bicep-bestanden. Laad in plaats daarvan deze waarden vanuit een gedeeld JSON-bestand in uw Bicep-bestand. Wanneer u matrices gebruikt, moet u de gedeelde waarden samenvoegen met implementatiespecifieke waarden in uw Bicep-code.

Context en probleem

Wanneer u uw Bicep-code schrijft, hebt u mogelijk algemene variabelen die u hergebruikt voor een set Bicep-bestanden. U kunt de waarden telkens dupliceren wanneer u de resource declareren, bijvoorbeeld door de waarden tussen uw Bicep-bestanden te kopiëren en te kopiëren. Deze aanpak is echter foutgevoelig en wanneer u wijzigingen moet aanbrengen, moet u elke resourcedefinitie bijwerken om deze synchroon te houden met de andere.

Bovendien, wanneer 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 verschil tussen de twee categorieën variabelen te begrijpen.

Oplossing

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

Voorbeeld 1: Voorvoegsels een naam geven

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

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

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

Declareer in uw Bicep-bestand een variabele die de voorvoegsels voor gedeelde naamgeving importeert:

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

Wanneer u uw resourcenamen definieert, gebruikt u tekenreeksinterpolatie om de voorvoegsels van de gedeelde naam samen tevoegen met unieke naamachtervoegsels:

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

Voorbeeld 2: Regels voor netwerkbeveiligingsgroep

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

Definieer een JSON-bestand met de algemene beveiligingsregels die van toepassing zijn binnen 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 die de gedeelde beveiligingsregels importeert:

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

Maak een variabele matrix 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 eigenschap in te securityRules stellen:

resource nsg 'Microsoft.Network/networkSecurityGroups@2020-05-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 is gegenereerd door Bicep. De JSON ARM-sjablonen die door Bicep worden gegenereerd, hebben een bestandslimiet van 4 MB, dus het is belangrijk om het gebruik van grote gedeelde variabele bestanden te voorkomen.
  • Zorg ervoor dat uw gedeelde variabele matrices niet conflicteren met de matrixwaarden die zijn opgegeven in elk Bicep-bestand. Als 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.