Warunkowe wdrażanie zasobów

Ukończone

Możesz użyć warunków w kodzie Bicep, aby wdrożyć zasoby tylko wtedy, gdy obowiązują określone ograniczenia.

Na przykład w firmie z toy musisz wdrożyć zasoby w różnych środowiskach. Podczas wdrażania ich w środowisku produkcyjnym należy upewnić się, że inspekcja jest włączona dla serwerów logicznych usługi Azure SQL. Jednak podczas wdrażania zasobów w środowiskach deweloperskich nie chcesz włączać inspekcji. Chcesz użyć jednego szablonu do wdrożenia zasobów we wszystkich środowiskach.

W tej lekcji dowiesz się, jak warunkowo wdrażać zasoby.

Korzystanie z podstawowych warunków

Podczas wdrażania zasobu w aplikacji Bicep można podać if słowo kluczowe, a następnie warunek. Warunek powinien zostać rozpoznany jako wartość logiczna (prawda lub fałsz). Jeśli wartość ma wartość true, zasób zostanie wdrożony. Jeśli wartość ma wartość false, zasób nie jest wdrożony.

Często tworzy się warunki na podstawie podanych wartości parametrów. Na przykład następujący kod wdraża konto magazynu tylko wtedy, gdy deployStorageAccount parametr ma wartość true:

param deployStorageAccount bool

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (deployStorageAccount) {
  name: 'teddybearstorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  // ...
}

Zwróć uwagę, że if słowo kluczowe znajduje się w tym samym wierszu co definicja zasobu.

Używanie wyrażeń jako warunków

Poprzedni przykład był dość podstawowy. Parametr deployStorageAccount był typu bool, więc jest jasne, czy ma wartość true , czy false.

W Bicep warunki mogą również zawierać wyrażenia. W poniższym przykładzie kod wdraża zasób inspekcji SQL tylko wtedy, gdy wartość parametru environmentName jest równa Production:

@allowed([
  'Development'
  'Production'
])
param environmentName string

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (environmentName == 'Production') {
  parent: server
  name: 'default'
  properties: {
  }
}

Zazwyczaj dobrym pomysłem jest utworzenie zmiennej dla wyrażenia, którego używasz jako warunku. Dzięki temu szablon jest łatwiejszy do zrozumienia i odczytania. Oto przykład:

@allowed([
  'Development'
  'Production'
])
param environmentName string

var auditingEnabled = environmentName == 'Production'

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

Zależy od zasobów wdrożonych warunkowo

Podczas warunkowego wdrażania zasobów czasami trzeba wiedzieć, w jaki sposób Bicep ocenia zależności między nimi.

Kontynuujmy pisanie kodu Bicep w celu wdrożenia ustawień inspekcji SQL. Plik Bicep musi również zadeklarować zasób konta magazynu, jak pokazano poniżej:

@allowed([
  'Development'
  'Production'
])
param environmentName string
param location string = resourceGroup().location
param auditStorageAccountName string = 'bearaudit${uniqueString(resourceGroup().id)}'

var auditingEnabled = environmentName == 'Production'
var storageAccountSkuName = 'Standard_LRS'

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
}

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

Zwróć uwagę, że konto magazynu również ma warunek. Oznacza to, że nie zostanie wdrożona w środowiskach nieprodukcyjnych. Zasób ustawień inspekcji SQL może teraz odwoływać się do szczegółów konta magazynu:

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

Zwróć uwagę, że ten kod Bicep używa operatora znaku zapytania (?) w obrębie storageEndpoint właściwości i storageAccountAccessKey . Po wdrożeniu kodu Bicep w środowisku produkcyjnym wyrażenia są oceniane na podstawie szczegółów z konta magazynu. Po wdrożeniu kodu w środowisku nieprodukcyjnym wyrażenia są obliczane na pusty ciąg ('').

Możesz się zastanawiać, dlaczego ten kod jest niezbędny, ponieważ auditingSettings oba auditStorageAccount te elementy mają ten sam warunek, dlatego nigdy nie trzeba wdrażać zasobu ustawień inspekcji SQL bez konta magazynu. Mimo że jest to prawdą, usługa Azure Resource Manager ocenia wyrażenia właściwości przed warunkowymi zasobami. Oznacza to, że jeśli kod Bicep nie ma tego wyrażenia, wdrożenie zakończy się niepowodzeniem z powodu błędu ResourceNotFound .

Uwaga

Nie można zdefiniować dwóch zasobów o tej samej nazwie w tym samym pliku Bicep, a następnie warunkowo wdrożyć tylko jeden z nich. Wdrożenie zakończy się niepowodzeniem, ponieważ usługa Resource Manager wyświetla to jako konflikt.

Jeśli masz kilka zasobów, wszystkie z tym samym warunkiem wdrożenia, rozważ użycie modułów Bicep. Możesz utworzyć moduł, który wdraża wszystkie zasoby, a następnie umieścić warunek w deklaracji modułu w głównym pliku Bicep.