Wzorzec pliku zmiennej udostępnionej

Zmniejsz powtórzenie wartości udostępnionych w plikach Bicep. Zamiast tego załaduj te wartości z udostępnionego pliku JSON w pliku Bicep. W przypadku korzystania z tablic połącz wartości udostępnione z wartościami specyficznymi dla wdrożenia w kodzie Bicep.

Kontekst i problem

Podczas pisania kodu Bicep może istnieć typowe zmienne, które są używane ponownie w zestawie plików Bicep. Wartości można zduplikować za każdym razem, gdy zadeklarujesz zasób, na przykład przez kopiowanie i wklejanie wartości między plikami Bicep. Jednak takie podejście jest podatne na błędy i gdy trzeba wprowadzić zmiany, należy zaktualizować każdą definicję zasobu, aby zachować synchronizację z innymi.

Ponadto podczas pracy ze zmiennymi zdefiniowanymi jako tablice może istnieć zestaw wspólnych wartości w wielu plikach Bicep, a także dodać określone wartości dla wdrażanego zasobu. Po połączeniu zmiennych udostępnionych ze zmiennymi specyficznymi dla zasobów trudniej jest zrozumieć rozróżnienie między dwiema kategoriami zmiennych.

Rozwiązanie

Utwórz plik JSON zawierający zmienne, które należy udostępnić. loadJsonContent() Użyj funkcji, aby załadować plik i uzyskać dostęp do zmiennych. W przypadku zmiennych tablicowych użyj concat() funkcji , aby połączyć wartości udostępnione z dowolnymi wartościami niestandardowymi dla określonego zasobu.

Przykład 1. Prefiksy nazewnictwa

Załóżmy, że masz wiele plików Bicep, które definiują zasoby. Musisz użyć spójnego prefiksu nazewnictwa dla wszystkich zasobów.

Zdefiniuj plik JSON zawierający wspólne prefiksy nazewnictwa stosowane w całej firmie:

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

W pliku Bicep zadeklaruj zmienną, która importuje prefiksy nazewnictwa współdzielonego:

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

Podczas definiowania nazw zasobów użyj interpolacji ciągów, aby połączyć prefiksy nazw udostępnionych z unikatowymi sufiksami nazw:

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

Przykład 2. Reguły sieciowej grupy zabezpieczeń

Załóżmy, że masz wiele plików Bicep, które definiują własne sieciowe grupy zabezpieczeń. Masz wspólny zestaw reguł zabezpieczeń, które należy zastosować do każdej sieciowej grupy zabezpieczeń, a następnie masz reguły specyficzne dla aplikacji, które należy dodać.

Zdefiniuj plik JSON zawierający typowe reguły zabezpieczeń stosowane w całej firmie:

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

W pliku Bicep zadeklaruj zmienną, która importuje reguły zabezpieczeń udostępnionych:

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

Utwórz tablicę zmiennych reprezentującą reguły niestandardowe dla tej konkretnej sieciowej grupy zabezpieczeń:

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

Zdefiniuj zasób sieciowej grupy zabezpieczeń. concat() Użyj funkcji , aby połączyć dwie tablice razem i ustawić securityRules właściwość:

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

Zagadnienia do rozważenia

  • W przypadku korzystania z tego podejścia plik JSON zostanie uwzględniony w szablonie usługi ARM wygenerowany przez Bicep. Szablony usługi ARM JSON wygenerowane przez Bicep mają limit plików 4 MB, dlatego należy unikać używania dużych plików zmiennych udostępnionych.
  • Upewnij się, że udostępnione tablice zmiennych nie powodują konfliktu z wartościami tablicy określonymi w każdym pliku Bicep. Na przykład w przypadku używania wzorca zestawu konfiguracji do definiowania sieciowych grup zabezpieczeń upewnij się, że nie masz wielu reguł, które definiują ten sam priorytet i kierunek.

Następne kroki

Dowiedz się więcej na temat wzorca zestawu konfiguracji.