Implementaciones condicionales en Bicep con la expresión if

Para implementar opcionalmente un recurso o módulo en Bicep, use la expresión if. Una expresión if incluye una condición que se resuelve en true o false. Cuando la condición if es true, se implementa el recurso. Cuando el valor es false, el recurso no se crea. El valor solo se puede aplicar a todo el recurso o módulo.

Nota:

La implementación condicional no se aplica en cascada a los recursos secundarios. Si desea implementar condicionalmente un recurso y sus recursos secundarios, debe aplicar la misma condición a cada tipo de recurso.

Recursos de aprendizaje

Si prefiere información sobre las condiciones mediante instrucciones paso a paso, consulte Creación de plantillas de Bicep flexibles mediante condiciones y bucles.

Definición de la condición para la implementación

En Bicep, puede implementar condicionalmente un recurso pasando un parámetro que especifica si el recurso está implementado. La condición se prueba con una expresión if en la declaración de recursos. En el ejemplo siguiente se muestra la sintaxis de una expresión if en un archivo de Bicep. Implementa condicionalmente una zona DNS. Cuando deployZone es true, implementa la zona DNS. Cuando deployZone es false, omite la implementación de la zona DNS.

param deployZone bool

resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

En el ejemplo siguiente se implementa un módulo de forma condicional.

param deployZone bool

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

Las condiciones se pueden usar con declaraciones de dependencia. En el caso de las dependencias explícitas, Azure Resource Manager lo quita automáticamente de las dependencias necesarias cuando el recurso no se implementa. En el caso de las dependencias implícitas, se permite hacer referencia a una propiedad de un recurso condicional, pero puede producirse un error de implementación.

Recurso nuevo o existente

Puede usar la implementación condicional para crear un recurso nuevo o usar uno existente. En el ejemplo siguiente se muestra cómo implementar una cuenta de almacenamiento nueva o usar una existente.

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

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

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

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

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

Cuando el parámetro newOrExisting está establecido en new, la condición se evalúa como true. Se implementa la cuenta de almacenamiento. De lo contrario, se usa la cuenta de almacenamiento existente.

Advertencia

Si hace referencia a un recurso implementado condicionalmente que no está implementado. Recibirá un error que indica que el recurso no está definido en la plantilla.

Funciones en tiempo de ejecución

Si usa una función reference o list con un recurso que se implementa de forma condicional, se puede evaluar la función incluso si el recurso no está implementado. Se genera un error si la función hace referencia a un recurso que no existe.

Use el operador de expresión condicional ?: para asegurarse de que la función solo se evalúa en las condiciones cuando se implementa el recurso. En la plantilla de ejemplo siguiente se muestra cómo usar esta función con expresiones que solo son válidas bajo ciertas condiciones.

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

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

Pasos siguientes