Condividi tramite


Modello set di configurazione

Invece di definire un numero elevato di singoli parametri, creare set predefiniti di valori. Durante la distribuzione, selezionare il set di valori da usare.

Contesto e problema

Un singolo file Bicep spesso definisce molte risorse. Ogni risorsa potrebbe dover usare una configurazione diversa a seconda dell'ambiente in cui viene distribuita. Ad esempio, è possibile compilare un file Bicep che distribuisce un piano di Servizio app e un'app e un account di archiviazione. Ognuna di queste risorse include più opzioni che influiscono sui costi, sulla disponibilità e sulla resilienza. Per gli ambienti di produzione, si desidera usare un set di configurazioni che assegnano priorità alla disponibilità elevata e alla resilienza. Per gli ambienti non di produzione, si desidera usare un set diverso di configurazione che assegna priorità alla riduzione dei costi.

È possibile creare parametri per ogni impostazione di configurazione, ma presenta alcuni svantaggi:

  • Questo approccio crea un carico per gli utenti del modello, poiché è necessario comprendere i valori da usare per ogni risorsa e l'impatto dell'impostazione di ogni parametro.
  • Il numero di parametri nel modello aumenta con ogni nuova risorsa definita.
  • Gli utenti possono selezionare combinazioni di valori di parametro che non sono stati testati o che non funzioneranno correttamente.

Soluzione

Creare un singolo parametro per specificare il tipo di ambiente. Usare una variabile per selezionare automaticamente la configurazione per ogni risorsa in base al valore del parametro.

Nota

Questo approccio viene a volte definito dimensionamento di tipo t-shirt. Quando si acquista una t-shirt, non si ottiene un sacco di opzioni per la sua lunghezza, larghezza, maniche e così via. È sufficiente scegliere tra piccole, medie e grandi dimensioni, e il designer di t-shirt ha predefinito tali misurazioni in base a tale dimensione.

Esempio

Si supponga di avere un modello che può essere distribuito in due tipi di ambiente: non di produzione e produzione. A seconda del tipo di ambiente, la configurazione necessaria è diversa:

Proprietà Ambienti di non-produzione Ambienti di produzione
Piano di servizio app
Nome SKU S2 P2V3
Capacità (numero di istanze) 1 3
App del Servizio app
Funzionamento continuo Disabled Attivata
Account di archiviazione
Nome SKU Standard_LRS Standard_ZRS

È possibile usare il modello di set di configurazione per questo modello.

Accettare un singolo parametro che indica il tipo di ambiente, ad esempio produzione o non di produzione. Usare il decorator del parametro @allowed per assicurarsi che gli utenti del modello forniscano solo valori previsti:

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

Creare quindi una variabiledi mappa, ovvero un oggetto che definisce la configurazione specifica a seconda del tipo di ambiente. Si noti che la variabile ha due oggetti denominati Production e NonProduction. Questi nomi corrispondono ai valori consentiti per il parametro nell'esempio precedente:

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

Quando si definiscono le risorse, usare la mappa di configurazione per definire le proprietà delle risorse:

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
}

Considerazioni

  • Nella variabile della mappa prendere in considerazione la possibilità di raggruppare le proprietà in base alla risorsa per semplificare la definizione.
  • Nella variabile della mappa è possibile definire entrambi i singoli valori di proprietà (ad esempio la proprietà alwaysOn nell'esempio) o le variabili oggetto che impostano una proprietà dell'oggetto, ad esempio le proprietà SKU dell'esempio.
  • Prendere in considerazione l'uso di un set di configurazione con condizioni delle risorse. In questo modo il codice Bicep può distribuire determinate risorse per ambienti specifici e non in altri.

Passaggi successivi

Informazioni sul criterio per il file di variabili condivise.