Vzor souboru sdílených proměnných

Snižte opakování sdílených hodnot v souborech Bicep. Místo toho načtěte tyto hodnoty ze sdíleného souboru JSON v souboru Bicep. Při použití polí zřetěďte sdílené hodnoty s hodnotami specifickými pro nasazení v kódu Bicep.

Kontext a problém

Při psaní kódu Bicep můžete mít společné proměnné, které opakovaně používáte v sadě souborů Bicep. Hodnoty můžete duplikovat pokaždé, když deklarujete prostředek, například zkopírováním a vložením hodnot mezi soubory Bicep. Tento přístup je však náchylný k chybám, a když potřebujete provést změny, musíte aktualizovat každou definici prostředku, aby byla synchronizovaná s ostatními.

Kromě toho při práci s proměnnými definovanými jako pole můžete mít sadu společných hodnot v několika souborech Bicep a také budete muset přidat konkrétní hodnoty pro prostředek, který nasazujete. Když smícháte sdílené proměnné s proměnnými specifickými pro prostředek, je pro někoho těžší pochopit rozdíl mezi těmito dvěma kategoriemi proměnných.

Řešení

Vytvořte soubor JSON obsahující proměnné, které potřebujete sdílet. loadJsonContent() Pomocí funkce načtěte soubor a získejte přístup k proměnným. U maticových proměnných pomocí concat() funkce zkombinujte sdílené hodnoty s libovolnými vlastními hodnotami pro konkrétní prostředek.

Příklad 1: Pojmenování předpon

Předpokládejme, že máte více souborů Bicep, které definují prostředky. Pro všechny prostředky musíte použít konzistentní předponu pro vytváření názvů.

Definujte soubor JSON, který obsahuje běžné předpony názvů, které platí ve vaší společnosti:

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

V souboru Bicep deklarujte proměnnou, která importuje sdílené předpony názvů:

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

Při definování názvů prostředků použijte interpolaci řetězců ke zřetězení předpon sdílených názvů s jedinečnými příponami názvů:

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

Příklad 2: Pravidla skupiny zabezpečení sítě

Předpokládejme, že máte několik souborů Bicep, které definují vlastní skupiny zabezpečení sítě (NSG). Máte společnou sadu pravidel zabezpečení, která se musí použít pro každou skupinu zabezpečení sítě, a pak máte pravidla specifická pro aplikaci, která je potřeba přidat.

Definujte soubor JSON, který obsahuje běžná pravidla zabezpečení, která platí ve vaší společnosti:

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

V souboru Bicep deklarujte proměnnou, která importuje sdílená pravidla zabezpečení:

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

Vytvořte pole proměnných, které představuje vlastní pravidla pro tuto konkrétní skupinu zabezpečení sítě:

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

Definujte prostředek NSG. concat() Pomocí funkce zkombinujte obě pole a nastavte securityRules vlastnost:

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

Požadavky

  • Když použijete tento přístup, soubor JSON se zahrne do šablony ARM vygenerované bicepem. Šablony JSON ARM vygenerované nástrojem Bicep mají limit souborů 4 MB, takže je důležité se vyhnout používání velkých souborů sdílených proměnných.
  • Ujistěte se, že pole sdílených proměnných nejsou v konfliktu s hodnotami polí zadanými v každém souboru Bicep. Pokud například používáte vzor konfigurační sady k definování skupin zabezpečení sítě, ujistěte se, že nemáte více pravidel, která definují stejnou prioritu a směr.

Další kroky

Přečtěte si o vzoru konfigurační sady.