Vzor souboru sdílené proměnné

Snižte počet opakování sdílených hodnot v souborech bicep. Místo toho tyto hodnoty načtěte ze sdíleného souboru JSON v souboru bicep. Při použití polí zřetězení sdílených hodnot 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é můžete opakovaně používat v rámci sady souborů bicep. Hodnoty je možné duplikovat při každém prohlášení prostředku, například zkopírováním a vložením hodnot mezi soubory bicep. Tento přístup je ale náchylný k chybám a když potřebujete udělat změny, abyste aktualizovali jednotlivé definice prostředků, abyste zachovali synchronizaci s ostatními.

Kromě toho, když pracujete s proměnnými definovanými jako pole, můžete mít sadu běžných hodnot v rámci více souborů bicep a také je potřeba přidat konkrétní hodnoty pro prostředek, který nasazujete. Při kombinaci sdílených proměnných s proměnnými specifickými pro prostředek je obtížnější pro někoho pochopit rozdíl mezi dvěma kategoriemi proměnných.

Řešení

Vytvořte soubor JSON, který obsahuje proměnné, které potřebujete sdílet. Pomocí json() funkce a loadTextContent() funkce načtěte soubor a získejte přístup k proměnným. Pro proměnné pole použijte concat() funkci ke kombinování sdílených hodnot se všemi 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 vaše prostředky je nutné použít konzistentní předponu názvů.

Zadejte soubor JSON, který obsahuje běžné předpony názvů, které se použijí napříč vaší společností:

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

V souboru bicep deklarujte proměnnou, která importuje předpony sdíleného pojmenování:

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

Při definování názvů prostředků použijte interpolaci řetězců k zřetězení předpon sdíleného názvu 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á musí být použita na každý NSG a pak máte pravidla specifická pro aplikaci, která musí být přidána.

Definujte soubor JSON, který obsahuje společná pravidla zabezpečení, která platí pro celou společnost:

{
  "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 pravidla sdíleného zabezpečení:

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

Vytvořte pole proměnných, které představuje vlastní pravidla pro tento konkrétní NSG:

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. Použijte concat() funkci pro kombinování obou polí dohromady a nastavte securityRules vlastnost:

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

Požadavky

  • Při použití tohoto přístupu se soubor JSON zahrne do šablony ARM generované v bicep. Šablony ARM ve formátu JSON generované bicep mají omezení 4 MB, takže je důležité vyhnout se použití velkých sdílených souborů proměnných.
  • Ujistěte se, že vaše sdílená pole proměnných nejsou v konfliktu s hodnotami pole zadanými v každém souboru bicep. Například při použití vzoru konfigurační sada k definování skupin zabezpečení sítě, zajistěte, abyste nepoužívali více pravidel, která definují stejnou prioritu a směr.

Další kroky

Přečtěte si o vzorcích konfiguračních sad.