Udostępnij za pośrednictwem


Wzorzec zestawu konfiguracji

Zamiast definiować wiele pojedynczych parametrów, utwórz wstępnie zdefiniowane zestawy wartości. Podczas wdrażania wybierz zestaw wartości do użycia.

Kontekst i problem

Pojedynczy plik Bicep często definiuje wiele zasobów. Każdy zasób może wymagać użycia innej konfiguracji w zależności od wdrażanego środowiska. Możesz na przykład utworzyć plik Bicep, który wdraża plan usługi App Service i aplikację oraz konto magazynu. Każdy z tych zasobów ma wiele opcji, które wpływają na koszt, dostępność i odporność. W przypadku środowisk produkcyjnych należy użyć jednego zestawu konfiguracji, który określa priorytety wysokiej dostępności i odporności. W przypadku środowisk nieprodukcyjnych należy użyć innego zestawu konfiguracji, który określa priorytety redukcji kosztów.

Można utworzyć parametry dla każdego ustawienia konfiguracji, ale takie podejście ma pewne wady:

  • Takie podejście powoduje obciążenie użytkowników szablonów, ponieważ muszą zrozumieć wartości, które mają być używane dla każdego zasobu, oraz wpływ ustawienia każdego parametru.
  • Liczba parametrów w szablonie zwiększa się wraz z każdym nowym zdefiniowanym zasobem.
  • Użytkownicy mogą wybierać kombinacje wartości parametrów, które nie zostały przetestowane lub które nie będą działać poprawnie.

Rozwiązanie

Utwórz pojedynczy parametr, aby określić typ środowiska. Użyj zmiennej, aby automatycznie wybrać konfigurację dla każdego zasobu na podstawie wartości parametru.

Uwaga

Takie podejście jest czasami nazywane ustalaniem rozmiaru koszulki. Kiedy kupujesz t-shirt, nie masz wielu opcji na jego długość, szerokość, rękawy i tak dalej. Po prostu wybierasz między małymi, średnimi i dużymi rozmiarami, a projektant t-shirt wstępnie zdefiniował te pomiary na podstawie tego rozmiaru.

Przykład

Załóżmy, że masz szablon, który można wdrożyć w dwóch typach środowiska: nieprodukcyjnym i produkcyjnym. W zależności od typu środowiska potrzebna konfiguracja jest inna:

Właściwości Środowiska nieprodukcyjne Środowiska produkcyjne
Plan usługi App Service
Nazwa jednostki SKU S2 P2V3
Pojemność (liczba wystąpień) 1 3
Aplikacja usługi App Service
Stały dostęp do usługi Disabled Włączony
Konto magazynu
Nazwa jednostki SKU Standard_LRS Standard_ZRS

Można użyć wzorca zestawu konfiguracji dla tego szablonu.

Zaakceptuj pojedynczy parametr, który wskazuje typ środowiska, taki jak produkcja lub nieprodukcyjna. Użyj dekoratora parametrów @allowed , aby upewnić się, że użytkownicy szablonu udostępniają tylko oczekiwane wartości:

@allowed([
  'Production'
  'NonProduction'
])
param environmentType string = 'NonProduction'

Następnie utwórz zmienną mapy, która jest obiektem definiującym konkretną konfigurację w zależności od typu środowiska. Zwróć uwagę, że zmienna ma dwa obiekty o nazwie Production i NonProduction. Te nazwy są zgodne z dozwolonymi wartościami parametru w poprzednim przykładzie:

var environmentConfigurationMap = {
  Production: {
    appServicePlan: {
      sku: {
        name: 'P2V3'
        capacity: 3
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_ZRS'
      }
    }
  }
  NonProduction: {
    appServicePlan: {
      sku: {
        name: 'S2'
        capacity: 1
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_LRS'
      }
    }
  }
}

Podczas definiowania zasobów użyj mapy konfiguracji, aby zdefiniować właściwości zasobu:

resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: appServicePlanName
  location: location
  sku: environmentConfigurationMap[environmentType].appServicePlan.sku
}

resource appServiceApp 'Microsoft.Web/sites@2022-09-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      alwaysOn: environmentConfigurationMap[environmentType].appServiceApp.alwaysOn
    }
  }
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: environmentConfigurationMap[environmentType].storageAccount.sku
}

Kwestie wymagające rozważenia

  • W zmiennej mapy rozważ grupowanie właściwości według zasobu, aby uprościć ich definicję.
  • W zmiennej mapy można zdefiniować zarówno poszczególne wartości właściwości (jak alwaysOn właściwość w przykładzie) lub zmienne obiektu, które ustawiają właściwość obiektu (na przykład właściwości jednostki SKU).
  • Rozważ użycie zestawu konfiguracji z warunkami zasobów. Dzięki temu kod Bicep może wdrażać pewne zasoby dla określonych środowisk, a nie w innych.

Następne kroki

Dowiedz się więcej o wzorcu pliku zmiennej udostępnionej.