Datei mit freigegebenen Variablen (Muster)
Verringert die Wiederholung freigegebener Werte in Ihren Bicep-Dateien. Stattdessen laden Sie diese Werte aus einer freigegebenen JSON-Datei in Ihre 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 gängige Variablen, die Sie über eine Gruppe von Bicep-Dateien hinweg wiederverwenden. Sie könnten 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 Ressourcen synchron zu halten.
Darüber hinaus verfügen Sie, wenn Sie mit Variablen arbeiten, die als Arrays definiert sind, möglicherweise über einen Satz gemeinsamer 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 für andere schwieriger, die Unterscheidung zwischen den beiden Kategorien von Variablen zu verstehen.
Lösung
Erstellen Sie eine JSON-Datei, die die Variablen enthält, die Sie freigeben müssen. Verwenden Sie die loadJsonContent()
-Funktion zum Laden der Datei und zum Zugreifen auf die Variablen. Verwenden Sie für Arrayvariablen die concat()
-Funktion, um die freigegebenen Werte mit den benutzerdefinierten Werten für die spezifische Ressource zu kombinieren.
Beispiel 1: Namenspräfixe
Angenommen, Sie verfügen über mehrere Bicep-Dateien, die Ressourcen definieren. Sie müssen ein konsistentes Namenspräfix für alle Ihre Ressourcen verwenden.
Definieren Sie eine JSON-Datei, die die gängigen Namenspräfixe enthält, die für Ihr gesamtes 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')
Wenn Sie Ihre Ressourcennamen definieren, verwenden Sie die Zeichenfolgeninterpolation, um die freigegebenen 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: Netzwerksicherheitsgruppen-Regeln
Angenommen, Sie verfügen über mehrere Bicep-Dateien, die ihre eigenen Netzwerksicherheitsgruppen (NSG) definieren. Sie verfügen über einen gemeinsamen Satz von Sicherheitsregeln, die auf jede Netzwerksicherheitsgruppe angewendet werden müssen, und ferner verfügen Sie über anwendungsspezifische Regeln, die hinzugefügt werden müssen.
Definieren Sie eine JSON-Datei, die die gängigen Sicherheitsregeln enthält, die für Ihr gesamtes 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 freigegebenen Sicherheitsregeln importiert:
var sharedRules = loadJsonContent('./shared-rules.json', 'securityRules')
Erstellen Sie ein Variablenarray, das die benutzerdefinierten Regeln für diese spezifische Netzwerksicherheitsgruppe 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 Netzwerksicherheitsgruppen-Ressource. Verwenden Sie die concat()
-Funktion, um die beiden Arrays miteinander zu kombinieren und die securityRules
-Eigenschaft festzulegen:
resource nsg 'Microsoft.Network/networkSecurityGroups@2021-08-01' = {
name: nsgName
location: location
properties: {
securityRules: concat(sharedRules, customRules)
}
}
Weitere Überlegungen
- Wenn Sie diesen Ansatz verwenden, wird die JSON-Datei in die von Bicep generierte ARM-Vorlage aufgenommen. Die von Bicep generierten JSON-ARM-Vorlagen besitzen einen Dateigrenzwert von 4 MB, weshalb es wichtig ist, die Verwendung großer freigegebener Variablendateien zu vermeiden.
- Stellen Sie sicher, dass Ihre freigegebenen Variablenarrays nicht mit den in jeder Bicep-Datei angegebenen Arraywerten in Konflikt stehen. Wenn Sie beispielsweise das Konfigurationsgruppenmuster zum Definieren von Netzwerksicherheitsgruppen verwenden, stellen Sie sicher, dass Sie nicht mehrere Regeln haben, die dieselbe Priorität und Richtung definieren.