Déploiements conditionnels dans Bicep avec l’expression if

Pour éventuellement déployer une ressource ou un module dans Bicep, utilisez l’expression if. Une expression if inclut une condition qui est résolue en true ou false. Quand la condition if a la valeur true, la ressource est déployée. Lorsque la valeur est false, la ressource n’est pas créée. La valeur ne peut être appliquée qu’à l’ensemble de la ressource ou du module.

Notes

L’exécution du déploiement conditionnel n’inclut pas les ressources enfants. Si vous souhaitez déployer une ressource et ses ressources enfants de manière conditionnelle, vous devez appliquer la même condition à chaque type de ressource.

Ressources de formation

Si vous préférez découvrir les conditions via des instructions d’aide pas à pas, consultez Créer des modèles Bicep flexibles en utilisant des conditions et des boucles.

Définir une condition du déploiement

Dans Bicep, vous pouvez déployer, de manière conditionnelle, une ressource en transmettant un paramètre qui spécifie si la ressource est déployée. Vous testez la condition avec une expression if dans la déclaration de la ressource. L’exemple suivant montre la syntaxe d’une expression if dans un fichier Bicep. Une zone DNS est déployée de manière conditionnelle. Quand deployZone a la valeur true, la zone DNS est déployée. Quand deployZone a la valeur false, le déploiement de la zone DNS est ignoré.

param deployZone bool

resource dnsZone 'Microsoft.Network/dnszones@2018-05-01' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

L’exemple suivant déploie un module de manière conditionnelle.

param deployZone bool

module dnsZone 'dnszones.bicep' = if (deployZone) {
  name: 'myZoneModule'
}

Les conditions peuvent être utilisées avec des déclarations de dépendance. Pour les dépendances explicites, Azure Resource Manager les supprime automatiquement des dépendances requises lorsque la ressource n’est pas déployée. Pour les dépendances implicites, le référencement d’une propriété d’une ressource conditionnelle est autorisé mais peut générer une erreur de déploiement.

Ressource nouvelle ou existante

Vous pouvez utiliser un déploiement conditionnel pour créer une ressource ou en utiliser une existante. L’exemple suivant montre comment déployer un nouveau compte de stockage ou utiliser un compte de stockage existant.

param storageAccountName string
param location string = resourceGroup().location

@allowed([
  'new'
  'existing'
])
param newOrExisting string = 'new'

resource saNew 'Microsoft.Storage/storageAccounts@2022-09-01' = if (newOrExisting == 'new') {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

resource saExisting 'Microsoft.Storage/storageAccounts@2022-09-01' existing = if (newOrExisting == 'existing') {
  name: storageAccountName
}

output storageAccountId string = ((newOrExisting == 'new') ? saNew.id : saExisting.id)

Lorsque le paramètre newOrExisting a la valeur new, la condition donne le résultat true. Le compte de stockage est déployé. Sinon, le compte de stockage existant est utilisé.

Avertissement

Si vous référencez une ressource à déploiement conditionnel qui n’est pas déployée. Vous recevez une erreur indiquant que la ressource n’est pas définie dans le modèle.

Fonctions de runtime

Si vous utilisez une fonction de référence ou de liste avec une ressource qui est déployée conditionnellement, la fonction est évaluée même si la ressource n’est pas déployée. Vous obtenez une erreur si la fonction fait référence à une ressource qui n’existe pas.

Utilisez l’opérateur d’expression conditionnelle ?: pour vous assurer que la fonction est évaluée uniquement pour les conditions lorsque la ressource est déployée. L’exemple de modèle suivant montre comment utiliser cette fonction avec des expressions qui sont uniquement valides de manière conditionnelle.

param vmName string
param location string
param logAnalytics string = ''

resource vmName_omsOnboarding 'Microsoft.Compute/virtualMachines/extensions@2023-03-01' = if (!empty(logAnalytics)) {
  name: '${vmName}/omsOnboarding'
  location: location
  properties: {
    publisher: 'Microsoft.EnterpriseCloud.Monitoring'
    type: 'MicrosoftMonitoringAgent'
    typeHandlerVersion: '1.0'
    autoUpgradeMinorVersion: true
    settings: {
      workspaceId: ((!empty(logAnalytics)) ? reference(logAnalytics, '2022-10-01').customerId : null)
    }
    protectedSettings: {
      workspaceKey: ((!empty(logAnalytics)) ? listKeys(logAnalytics, '2022-10-01').primarySharedKey : null)
    }
  }
}

output mgmtStatus string = ((!empty(logAnalytics)) ? 'Enabled monitoring for VM!' : 'Nothing to enable')

Étapes suivantes