Freigeben über


Dateimuster für freigegebene Variablen

Verringert die Wiederholung freigegebener Werte in Ihren Bicep-Dateien. Laden Sie stattdessen diese Werte aus einer freigegebenen JSON-Datei in Ihrer Bicep-Datei. Bei Verwendung von Arrays verketten Sie die freigegebenen Werte mit bereitstellungsspezifischen Werten in Ihrem Bicep-Code.

Kontext und Problem

Wenn Sie Ihren Bicep-Code schreiben, verfügen Sie möglicherweise über allgemeine Variablen, die Sie in einer Reihe von Bicep-Dateien wiederverwenden. Sie können die Werte jedes Mal duplizieren, wenn Sie die Ressource deklarieren, z. B. durch Kopieren und Einfügen der Werte zwischen Ihren Bicep-Dateien. Dieser Ansatz ist jedoch fehleranfällig, und wenn Sie Änderungen vornehmen müssen, müssen Sie jede Ressourcendefinition aktualisieren, um sie mit den anderen zu synchronisieren.

Wenn Sie mit Variablen arbeiten, die als Arrays definiert sind, verfügen Sie möglicherweise über einen Satz allgemeiner Werte für mehrere Bicep-Dateien und müssen außerdem bestimmte Werte für die Ressource hinzufügen, die Sie bereitstellen. Wenn Sie die freigegebenen Variablen mit den ressourcenspezifischen Variablen kombinieren, ist es schwieriger, die Unterscheidung zwischen den beiden Variablenkategorien zu verstehen.

Lösung

Erstellen Sie eine JSON-Datei, die die Variablen enthält, die Sie freigeben müssen. Verwenden Sie die loadJsonContent() Funktion , um die Datei zu laden und auf die Variablen zuzugreifen. Verwenden Sie für Arrayvariablen die concat() Funktion , um die freigegebenen Werte mit allen benutzerdefinierten Werten für die jeweilige Ressource zu kombinieren.

Beispiel 1: Benennen von Präfixen

Angenommen, Sie haben mehrere Bicep-Dateien, die Ressourcen definieren. Sie müssen ein einheitliches Benennungspräfix für alle Ihre Ressourcen verwenden.

Definieren Sie eine JSON-Datei, die die allgemeinen Namenspräfixe enthält, die für Ihr Unternehmen gelten:

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

Deklarieren Sie in Ihrer Bicep-Datei eine Variable, die die freigegebenen Namenspräfixe importiert:

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

Verwenden Sie beim Definieren der Ressourcennamen die Zeichenfolgeninterpolation, um die gemeinsamen Namenspräfixe mit eindeutigen Namenssuffixen zu verketten.

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

Beispiel 2: Regeln für Netzwerksicherheitsgruppen

Angenommen, Sie haben mehrere Bicep-Dateien, die ihre eigenen Netzwerksicherheitsgruppen (NSG) definieren. Sie verfügen über einen gemeinsamen Satz von Sicherheitsregeln, die auf jede NSG angewendet werden müssen, und dann über anwendungsspezifische Regeln verfügen, die hinzugefügt werden müssen.

Definieren Sie eine JSON-Datei, die die allgemeinen Sicherheitsregeln enthält, die für Ihr Unternehmen gelten:

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

Deklarieren Sie in Ihrer Bicep-Datei eine Variable, die die gemeinsamen Sicherheitsregeln importiert.

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

Erstellen Sie ein Variablearray, das die benutzerdefinierten Regeln für diese spezifische NSG darstellt:

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

Definieren Sie die NSG-Ressource. Verwenden Sie die concat() Funktion, um die beiden Arrays zusammen zu kombinieren und die securityRules Eigenschaft festzulegen:

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

Überlegungen

  • Wenn Sie diesen Ansatz verwenden, wird die JSON-Datei in die ARM-Vorlage eingeschlossen, die von Bicep generiert wird. Die von Bicep generierten JSON-ARM-Vorlagen weisen einen Dateigrenzwert von 4 MB auf, daher ist es wichtig, die Verwendung großer freigegebener Variablendateien zu vermeiden.
  • Stellen Sie sicher, dass Ihre gemeinsam genutzten Variablen-Arrays nicht mit den in jeder Bicep-Datei angegebenen Arraywerten in Konflikt stehen. Wenn Sie beispielsweise das Konfigurationssatzmuster zum Definieren von Netzwerksicherheitsgruppen verwenden, stellen Sie sicher, dass Sie nicht über mehrere Regeln verfügen, die dieselbe Priorität und Richtung definieren.

Nächste Schritte

Erfahren Sie mehr über das Konfigurationssatzmuster.