Partilhar via


Implantações condicionais no Bicep com a expressão if

Para implantar opcionalmente um recurso ou módulo no Bicep, use a if expressão. Uma if expressão inclui uma condição que se resolve como true ou false. Quando a if condição é verdadeira, o recurso é implantado. Quando o valor é false, o recurso não é criado. O valor só pode ser aplicado a todo o recurso ou módulo.

Nota

A implantação condicional não entra em cascata para recursos filho. Se desejar implantar condicionalmente um recurso e seus recursos filho, você deverá aplicar a mesma condição a cada tipo de recurso.

Recursos de formação

Se preferir saber mais sobre as condições por meio de orientação passo a passo, consulte Criar modelos flexíveis do Bicep usando condições e loops.

Definir condição para implantação

No Bicep, você pode implantar condicionalmente um recurso passando um parâmetro que especifica se o recurso é implantado. Você testa a condição com uma if expressão na declaração de recurso. O exemplo a seguir mostra a sintaxe de uma if expressão em um arquivo Bicep. Ele implanta condicionalmente uma zona DNS. Quando deployZone é true, ele implanta a zona DNS. Quando deployZone é false, ele ignora a implantação da zona DNS.

param deployZone bool

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

O próximo exemplo implanta condicionalmente um módulo.

param deployZone bool

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

As condições podem ser usadas com declarações de dependência. Para dependências explícitas, o Azure Resource Manager o remove automaticamente das dependências necessárias quando o recurso não é implantado. Para dependências implícitas, a referência a uma propriedade de um recurso condicional é permitida, mas pode produzir um erro de implantação.

Recurso novo ou existente

Você pode usar a implantação condicional para criar um novo recurso ou usar um existente. O exemplo a seguir mostra como implantar uma nova conta de armazenamento ou usar uma conta de armazenamento 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)

Quando o parâmetro newOrExisting é definido como novo, a condição é avaliada como true. A conta de armazenamento é implantada. Caso contrário, a conta de armazenamento existente será usada.

Aviso

Se você fizer referência a um recurso implantado condicionalmente que não está implantado. Você receberá um erro dizendo que o recurso não está definido no modelo.

Funções de tempo de execução

Se você usar uma função de referência ou lista com um recurso implantado condicionalmente, a função será avaliada mesmo que o recurso não seja implantado. Você receberá um erro se a função se referir a um recurso que não existe.

Use a expressão condicional ?: para garantir que a função seja avaliada apenas para condições quando o recurso for implantado. O modelo de exemplo a seguir mostra como usar essa função com expressões que são apenas condicionalmente válidas.

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

Próximos passos