Resources voorwaardelijk implementeren

Voltooid

U kunt voorwaarden in uw Bicep-code gebruiken om resources alleen te implementeren wanneer er specifieke beperkingen zijn.

In uw speelgoedbedrijf moet u bijvoorbeeld resources implementeren in verschillende omgevingen. Wanneer u deze implementeert in een productieomgeving, moet u ervoor zorgen dat controle is ingeschakeld voor uw logische Azure SQL-servers. Maar wanneer u resources implementeert in ontwikkelomgevingen, wilt u geen controle inschakelen. U wilt één sjabloon gebruiken om resources in al uw omgevingen te implementeren.

In deze les leert u hoe u resources voorwaardelijk implementeert.

Basisvoorwaarden gebruiken

Wanneer u een resource in Bicep implementeert, kunt u het if trefwoord opgeven gevolgd door een voorwaarde. De voorwaarde moet worden omgezet in een Booleaanse waarde (waar of onwaar). Als de waarde waar is, wordt de resource geïmplementeerd. Als de waarde onwaar is, wordt de resource niet geïmplementeerd.

Het is gebruikelijk om voorwaarden te maken op basis van de waarden van parameters die u opgeeft. Met de volgende code wordt bijvoorbeeld alleen een opslagaccount geïmplementeerd wanneer de deployStorageAccount parameter is ingesteld trueop:

param deployStorageAccount bool

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (deployStorageAccount) {
  name: 'teddybearstorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  // ...
}

U ziet dat het if trefwoord zich op dezelfde regel bevindt als de resourcedefinitie.

Expressies gebruiken als voorwaarden

Het voorgaande voorbeeld was vrij eenvoudig. De deployStorageAccount parameter was van het type bool, dus het is duidelijk of deze een waarde heeft van true of false.

In Bicep kunnen voorwaarden ook expressies bevatten. In het volgende voorbeeld implementeert de code alleen een SQL-controleresource wanneer de environmentName parameterwaarde gelijk is aan Production:

@allowed([
  'Development'
  'Production'
])
param environmentName string

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (environmentName == 'Production') {
  parent: server
  name: 'default'
  properties: {
  }
}

Het is meestal een goed idee om een variabele te maken voor de expressie die u als voorwaarde gebruikt. Op die manier is uw sjabloon gemakkelijker te begrijpen en te lezen. Hier volgt een voorbeeld:

@allowed([
  'Development'
  'Production'
])
param environmentName string

var auditingEnabled = environmentName == 'Production'

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

Afhankelijk van voorwaardelijk geïmplementeerde resources

Wanneer u resources voorwaardelijk implementeert, moet u soms weten hoe Bicep de afhankelijkheden tussen deze resources evalueert.

Laten we enkele Bicep-code gaan schrijven om SQL-controle-instellingen te implementeren. Het Bicep-bestand moet ook een opslagaccountresource declareren, zoals hier wordt weergegeven:

@allowed([
  'Development'
  'Production'
])
param environmentName string
param location string = resourceGroup().location
param auditStorageAccountName string = 'bearaudit${uniqueString(resourceGroup().id)}'

var auditingEnabled = environmentName == 'Production'
var storageAccountSkuName = 'Standard_LRS'

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
}

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

U ziet dat het opslagaccount ook een voorwaarde heeft. Dit betekent dat deze ook niet wordt geïmplementeerd voor niet-productieomgevingen. De resource voor sql-controle-instellingen kan nu verwijzen naar de details van het opslagaccount:

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

U ziet dat deze Bicep-code gebruikmaakt van de operator vraagteken (?) binnen de storageEndpoint en storageAccountAccessKey eigenschappen. Wanneer de Bicep-code wordt geïmplementeerd in een productieomgeving, worden de expressies geëvalueerd op de details van het opslagaccount. Wanneer de code wordt geïmplementeerd in een niet-productieomgeving, evalueren de expressies een lege tekenreeks ('').

U vraagt zich misschien af waarom deze code nodig is, omdat auditingSettings en auditStorageAccount beide dezelfde voorwaarde hebben. U hoeft dus nooit een resource voor SQL-controle-instellingen te implementeren zonder een opslagaccount. Hoewel dit waar is, evalueert Azure Resource Manager de eigenschapsexpressies vóór de voorwaarden voor de resources. Dit betekent dat als de Bicep-code deze expressie niet heeft, de implementatie mislukt met een ResourceNotFound fout.

Notitie

U kunt twee resources met dezelfde naam niet definiëren in hetzelfde Bicep-bestand en vervolgens slechts één van deze resources voorwaardelijk implementeren. De implementatie mislukt, omdat Resource Manager dit als een conflict bekijkt.

Als u meerdere resources hebt, allemaal met dezelfde voorwaarde voor implementatie, kunt u Bicep-modules gebruiken. U kunt een module maken waarmee alle resources worden geïmplementeerd en vervolgens een voorwaarde op de moduledeclaratie in uw belangrijkste Bicep-bestand worden geplaatst.