Configuratiesetpatroon

In plaats van veel afzonderlijke parameters te definiëren, maakt u vooraf gedefinieerde sets met waarden. Selecteer tijdens de implementatie de set waarden die u wilt gebruiken.

Context en probleem

Eén Bicep-bestand definieert vaak veel resources. Elke resource moet mogelijk een andere configuratie gebruiken, afhankelijk van de omgeving waarin u deze implementeert. U kunt bijvoorbeeld een Bicep-bestand maken dat een App Service app en een opslagaccount implementeert. Elk van deze resources heeft meerdere opties die van invloed zijn op de kosten, beschikbaarheid en tolerantie. Voor productieomgevingen wilt u één set configuraties gebruiken die prioriteit geven aan hoge beschikbaarheid en tolerantie. Voor niet-productieomgevingen wilt u een andere set configuraties gebruiken die prioriteit geeft aan kostenreductie.

U kunt parameters maken voor elke configuratie-instelling, maar dit heeft enkele nadelen:

  • Deze aanpak zorgt voor een belasting voor uw sjabloongebruikers, omdat ze inzicht moeten hebben in de waarden die voor elke resource moeten worden gebruikt en de impact van het instellen van elke parameter.
  • Het aantal parameters in uw sjabloon neemt toe met elke nieuwe resource die u definieert.
  • Gebruikers kunnen combinaties van parameterwaarden selecteren die niet zijn getest of die niet goed werken.

Oplossing

Maak één parameter om het omgevingstype op te geven. Gebruik een variabele om automatisch de configuratie voor elke resource te selecteren op basis van de waarde van de parameter.

Notitie

Deze benadering wordt ook wel t-shirt-formaat genoemd. Wanneer u een t-shirt koopt, krijgt u niet veel opties voor de lengte, breedte, hoesjes, enzovoort. U kunt kiezen tussen kleine, middelgrote en grote formaten. De ontwerper van het t-shirt heeft deze metingen vooraf gedefinieerd op basis van die grootte.

Voorbeeld

Stel dat u een sjabloon hebt die kan worden geïmplementeerd in twee typen omgevingen: niet-productie en productie. Afhankelijk van het omgevingstype is de configuratie die u nodig hebt anders:

Eigenschap Niet-productieomgevingen Productieomgevingen
App Service-plan
SKU-naam S2 P2V3
Capaciteit (aantal exemplaren) 1 3
App Service app
AlwaysOn Uitgeschakeld Ingeschakeld
Opslagaccount
SKU-naam Standard_LRS Standard_ZRS

U kunt het configuratiesetpatroon voor deze sjabloon gebruiken.

Accepteer één parameter die het omgevingstype aangeeft, zoals productie of niet-productie. Gebruik de parameterparameter om ervoor te zorgen dat de gebruikers van uw sjabloon alleen @allowed waarden opgeven die u verwacht:

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

Maak vervolgens een kaartvariabele. Dit is een object dat de specifieke configuratie definieert, afhankelijk van het omgevingstype. U ziet dat de variabele twee objecten heeft met de Production naam en NonProduction . Deze namen komen overeen met de toegestane waarden voor de parameter in het voorgaande voorbeeld:

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

Wanneer u de resources definieert, gebruikt u het configuratiekaart om de resource-eigenschappen te definiëren:

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

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

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

Overwegingen

  • In uw kaartvariabele kunt u de eigenschappen groeperen op resource om de definitie ervan te vereenvoudigen.
  • In uw kaartvariabele kunt u zowel afzonderlijke eigenschapswaarden (zoals de eigenschap in het voorbeeld) als objectvariabelen definiëren die een alwaysOn objecteigenschappen instellen (zoals de SKU-eigenschappen in het voorbeeld).
  • Overweeg het gebruik van een configuratieset met resourcevoorwaarden. Hierdoor kan uw Bicep-code bepaalde resources implementeren voor specifieke omgevingen en niet in andere.

Volgende stappen

Meer informatie over het bestandspatroon met gedeelde variabelen.