Delen via


Patroon configuratieset

In plaats van veel afzonderlijke parameters te definiëren, maakt u vooraf gedefinieerde sets 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 waarnaar u deze implementeert. U kunt bijvoorbeeld een Bicep-bestand bouwen waarmee een App Service-plan en -app en een opslagaccount worden geïmplementeerd. 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 geeft 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 deze benadering heeft enkele nadelen:

  • Deze benadering 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 wordt verhoogd met elke nieuwe resource die u definieert.
  • Gebruikers kunnen combinaties van parameterwaarden selecteren die niet zijn getest of die niet correct 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, mouwen, enzovoort. U kunt kiezen tussen kleine, middelgrote en grote maten, en de t-shirt designer heeft vooraf gedefinieerd die metingen op basis van die grootte.

Opmerking

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:

Eigenschappen Niet-productieomgevingen Productieomgevingen
App Service-plan
SKU-naam S2 P2V3
Capaciteit (aantal exemplaren) 1 3
App Service-app
Altijd ingeschakeld Disabled Ingeschakeld
Opslagaccount
SKU-naam Standard_LRS Standard_ZRS

U kunt het patroon voor de configuratieset voor deze sjabloon gebruiken.

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

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

Maak vervolgens een kaartvariabele, een object dat de specifieke configuratie definieert, afhankelijk van het omgevingstype. U ziet dat de variabele twee objecten heeft met de naam Production 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 de configuratietoewijzing om de resource-eigenschappen te definiëren:

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
}

Overwegingen

  • Overweeg in de kaartvariabele de eigenschappen te groeperen op resource om de definitie te vereenvoudigen.
  • In de kaartvariabele kunt u beide afzonderlijke eigenschapswaarden definiëren (zoals de alwaysOn eigenschap in het voorbeeld) of objectvariabelen die een objecteigenschap 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 voor gedeelde variabelen.