Wdrożenia warunkowe w Bicep z wyrażeniem if

Aby opcjonalnie wdrożyć zasób lub moduł w środowisku Bicep, użyj if wyrażenia . Wyrażenie if zawiera warunek, który rozpoznaje wartość true lub false. Jeśli if warunek ma wartość true, zasób jest wdrażany. Gdy wartość jest fałsz, zasób nie jest tworzony. Wartość można zastosować tylko do całego zasobu lub modułu.

Uwaga

Wdrożenie warunkowe nie jest kaskadowe dla zasobów podrzędnych. Jeśli chcesz warunkowo wdrożyć zasób i jego zasoby podrzędne, musisz zastosować ten sam warunek do każdego typu zasobu.

Zasoby szkoleniowe

Jeśli wolisz dowiedzieć się więcej o warunkach za pomocą szczegółowych wskazówek, zobacz Tworzenie elastycznych szablonów Bicep przy użyciu warunków i pętli.

Definiowanie warunku wdrożenia

W środowisku Bicep można warunkowo wdrożyć zasób, przekazując parametr określający, czy zasób jest wdrażany. Warunek należy przetestować za pomocą if wyrażenia w deklaracji zasobu. Poniższy przykład przedstawia składnię if wyrażenia w pliku Bicep. Warunkowo wdraża strefę DNS. Gdy deployZone wartość to true, wdraża strefę DNS. Gdy deployZone wartość to false, pomija wdrażanie strefy DNS.

param deployZone bool

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

Następny przykład warunkowo wdraża moduł.

param deployZone bool

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

Warunki mogą być używane z deklaracjami zależności. W przypadku jawnych zależności usługa Azure Resource Manager automatycznie usuwa je z wymaganych zależności, gdy zasób nie jest wdrożony. W przypadku zależności niejawnych odwołanie do właściwości zasobu warunkowego jest dozwolone, ale może spowodować błąd wdrożenia.

Nowy lub istniejący zasób

Za pomocą wdrożenia warunkowego można utworzyć nowy zasób lub użyć istniejącego. W poniższym przykładzie pokazano, jak wdrożyć nowe konto magazynu lub użyć istniejącego konta magazynu.

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)

Gdy parametr newOrExisting jest ustawiony na nowy, warunek ma wartość true. Konto magazynu jest wdrażane. W przeciwnym razie jest używane istniejące konto magazynu.

Ostrzeżenie

Jeśli odwołujesz się do warunkowo wdrożonego zasobu, który nie jest wdrożony. Zostanie wyświetlony błąd informujący, że zasób nie jest zdefiniowany w szablonie.

Funkcje środowiska uruchomieniowego

Jeśli używasz funkcji odwołania lub listy z zasobem, który jest wdrażany warunkowo, funkcja jest oceniana nawet wtedy, gdy zasób nie jest wdrożony. Jeśli funkcja odwołuje się do zasobu, który nie istnieje, występuje błąd.

Użyj operatora wyrażenia warunkowego ?: aby upewnić się, że funkcja jest oceniana tylko pod kątem warunków, gdy zasób jest wdrożony. Poniższy przykładowy szablon pokazuje, jak używać tej funkcji z wyrażeniami, które są tylko warunkowo prawidłowe.

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

Następne kroki