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
alwaysOnobjecteigenschappen 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.