Partager via


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. Vous ne pouvez appliquer la valeur qu’à l’ensemble de la ressource ou du module.

Avertissement

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.

Le code de diagnostic Bicep BCP318 se produit lorsque vous essayez d’accéder à une propriété sur une ressource conditionnelle qui peut être null si la ressource n’est pas déployée. Pour supprimer l’avertissement ou empêcher une exception d’exécution, utilisez l’opérateur null-forgiving ou l’opérateur safe-dereference. Pour plus d’informations, consultez BCP318.

Définir une condition pour le 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. Testez la condition avec une if expression dans la déclaration de ressource. L’exemple suivant montre la syntaxe d’une expression if dans un fichier Bicep. Il déploie de manière conditionnelle une zone DNS (Domain Name System). 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@2023-07-01-preview' = 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'
}

Vous pouvez utiliser des conditions avec des déclarations de dépendance. Azure Resource Manager supprime automatiquement les dépendances explicites des dépendances exigées 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@2025-06-01' = if (newOrExisting == 'new') {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

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

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

Lorsque le paramètre newOrExisting est défini sur new, la condition l’évalue comme 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éployée de manière conditionnelle, mais que la ressource n’est pas déployée, vous obtenez une erreur. Le message d’erreur indique 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 que vous spécifiez pour le déploiement conditionnel, la fonction est évaluée. Si la ressource n’est pas déployée, vous obtenez une erreur.

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

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

resource vmName_omsOnboarding 'Microsoft.Compute/virtualMachines/extensions@2025-04-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