有條件地部署資源
您可以在 Bicep 程式碼中使用條件,只在特定條件約束就緒才時部署資源。
例如,在您的玩具公司,您需要將資源部署到各種環境。 部署到實際執行環境時,您需要確定 Azure SQL 邏輯伺服器已啟用稽核。 但將資源部署到開發環境時,您不想要啟用稽核。 您想要使用單一範本將資源部署到所有環境。
在本單元中,您會了解如何有條件地部署資源。
使用基本條件
在 Bicep 中部署資源時,您可以提供 if
關鍵字,後面接著條件。 條件應該解析為布林值 (true 或 false)。 如果值為 true,就會部署資源。 如果值為 false,則不會部署資源。
通常會根據您提供的參數值來建立條件。 例如,下列程式碼只有在 deployStorageAccount
參數設定為 true
時,才會部署儲存體帳戶:
param deployStorageAccount bool
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (deployStorageAccount) {
name: 'teddybearstorage'
location: resourceGroup().location
kind: 'StorageV2'
// ...
}
請注意,if
關鍵字與資源定義在同一行。
使用運算式作為條件
上述範例相當基本。 deployStorageAccount
參數是 bool
類型,很顯然值為 true
或 false
。
在 Bicep 中,條件也可以包含運算式。 在下列範例中,只有當 environmentName
參數值等於 Production
時,程式碼才會部署 SQL 稽核資源:
@allowed([
'Development'
'Production'
])
param environmentName string
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (environmentName == 'Production') {
parent: server
name: 'default'
properties: {
}
}
最好替作為條件的運算式建立變數。 這樣會更容易理解和閱讀您的範本。 以下是範例:
@allowed([
'Development'
'Production'
])
param environmentName string
var auditingEnabled = environmentName == 'Production'
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
}
}
依賴有條件部署的資源
當您有條件地部署資源時,有時需要知道 Bicep 如何評估資源之間的相依性。
讓我們繼續撰寫一些 Bicep 程式碼,以部署 SQL 稽核設定。 Bicep 檔案也需要宣告儲存體帳戶資源,如下所示:
@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@2023-05-01' = if (auditingEnabled) {
name: auditStorageAccountName
location: location
sku: {
name: storageAccountSkuName
}
kind: 'StorageV2'
}
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
}
}
請注意,儲存體帳戶也有條件。 這表示也不會部署到非實際執行環境。 SQL 稽核設定資源現在可以參考儲存體帳戶的詳細資料:
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-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 : ''
}
}
請注意,此 Bicep 程式碼在 storageEndpoint
和 storageAccountAccessKey
屬性內使用問號 (?
) 運算子。 將 Bicep 程式碼部署至實際執行環境時,運算式會評估為儲存體帳戶的詳細資料。 將程式碼部署至非實際執行環境時,運算式會評估為空字串 (''
)。
您可能會想知道為何需要此程式碼,因為 auditingSettings
和 auditStorageAccount
兩者都有相同的條件,因此,在無儲存體帳戶的情況下,您永遠不需要部署 SQL 稽核設定資源。 雖然如此,但 Azure Resource Manager 會先在資源上評估屬性運算式,再評估條件。 這表示,如果 Bicep 程式碼沒有這個運算式,則部署會失敗並發生 ResourceNotFound
錯誤。
注意
您無法在相同的 Bicep 檔案中定義兩個相同名稱的資源,然後有條件地只部署其中一個資源。 因為 Resource Manager 將此視為衝突,部署會失敗。
如果您有幾個資源全都有相同的部署條件,請考慮使用 Bicep 模組。 您可以建立部署所有資源的模組,然後在 Bicep 主檔案中的模組宣告上設定條件。