與 auditIfNotExists類似,原則 deployIfNotExists 定義會在符合條件時執行範本部署。 將效果設定為 DeployIfNotExists 的原則指派需要受控識別動作補救。
DeployIfNotExists 評估
deployIfNotExists 會在資源提供者處理建立或更新訂閱或資源要求並傳回成功狀態代碼後,經過可設定的延遲後執行。 如果沒有相關資源,或是由 existenceCondition 所定義的資源未被評估為 true,就會進行範本部署。 部署的持續時間取決於範本所含資源的複雜度。
在評估循環期間,符合 DeployIfNotExists 效果的資源會被標示為不合規,但不會對該資源採取任何動作。 現有的不符合規範的資源可以透過 補救工作進行修正。
DeployIfNotExists 屬性
DeployIfNotExists 效果的 details 屬性具有定義要比對的相關資源以及要執行的範本部署的所有子屬性。
-
type(必要)- 指定要比對之相關資源的型別。
- 如果
type是條件資源下if的資源類型,則原則會在評估的資源範圍內查詢此type資源。 否則,原則會在與受評估資源相同的資源群組或訂用帳戶內查詢 (視existenceScope而定)。
-
name(選擇性)- 指定要比對的資源確切名稱,並讓原則擷取一個特定資源,而不是指定類型的所有資源。
- 當
if.field.type和then.details.type的條件值匹配時,name就會變成必要,且必須是[field('name')],或者[field('fullName')]子資源。
備註
type 和 name 區段可以合併以通用方式擷取巢狀資源。
若要擷取特定資源,您可以使用 "type": "Microsoft.ExampleProvider/exampleParentType/exampleNestedType" 和 "name": "parentResourceName/nestedResourceName"。
若要擷取巢狀資源的集合,可以提供通配符 ? 來取代最後一個區段。 例如,"type": "Microsoft.ExampleProvider/exampleParentType/exampleNestedType" 和 "name": "parentResourceName/?"。 這可以與欄位函式結合,以存取與評估資源相關的資源,例如 "name": "[concat(field('name'), '/?')]"。
resourceGroupName(選用)- 允許比對來自不同資源群組的相關資源。
- 如果
type是條件資源底下if的資源,則不適用。 - 預設值為
if條件資源的資源群組。 - 如果執行範本部署,則會部署在此值的資源群組中。
existenceScope(選用)- 允許的值為 Subscription 和 ResourceGroup。
- 設定要從何處擷取要比對之相關資源的範圍。
- 如果
type是條件資源底下if的資源,則不適用。 - 針對 ResourceGroup,如果有指定,則會限制在
resourceGroupName資源群組之中。resourceGroupName未指定時,將限制至條件if資源的資源群組,這是預設行為。 - 針對 [訂用帳戶],查詢相關資源的整個訂用帳戶。 指派範圍應該在訂閱層級或更高層級設定,才能進行適當的評估。
- 預設值為 ResourceGroup。
evaluationDelay(選用)- 指定何時應該評估相關資源的存在狀態。 延遲僅適用於建立或更新資源要求結果的評估。
- 允許的值為
AfterProvisioning、AfterProvisioningSuccess、AfterProvisioningFailure或 ISO 8601 持續時間,介於 0 到 360 分鐘之間。 -
AfterProvisioning 值會檢視在原則規則
if條件中所評估的資源布建結果。AfterProvisioning在布建完成之後執行,不論結果為何。 如果佈建時間超過 6 小時,則判斷 AfterProvisioning 評估延遲時,會將其視為失敗。 - 預設值為
PT10M(10 分鐘)。 - 若指定長時間的評估延遲,可能會導致記錄的資源合規性狀態在下次評估觸發程序之前不會更新。
existenceCondition(選用)- 如果未指定,則任何相關資源
type都符合效果,且不會觸發部署。 - 使用與條件原則規則
if相同的語言,但會個別針對每個相關資源進行評估。 - 如果有任何相符的相關資源評估為 true,便可滿足此效果,而不會觸發部署。
- 可以使用 [field()] 來檢查條件中的
if值是否相等。 - 例如,可用來驗證父資源 (條件中
if) 是否與比對相關資源位於相同的資源位置。
- 如果未指定,則任何相關資源
roleDefinitionIds(必要)- 此屬性必須包含與訂用帳戶可存取之角色型存取控制角色識別碼相符的字串陣列。 如需詳細資訊,請參閱補救 - 設定原則定義。
deploymentScope(選用)- 允許的值為 Subscription 和 ResourceGroup。
- 設定要觸發的部署類型。 訂閱 指的是訂閱層級的部署,ResourceGroup 指的是資源群組的部署。
- 使用訂用帳戶層級部署時,必須在部署中指定location屬性。
- 預設值為 ResourceGroup。
deployment(必要)- 此屬性應該包含完整的範本部署,因為它會傳遞至
Microsoft.Resources/deploymentsPUT API。 如需詳細資訊,請參閱 部署 REST API。 - 範本內的巢狀
Microsoft.Resources/deployments應該使用唯一名稱,以避免在多個原則評估之間發生競爭。 父部署的名稱可以透過[concat('NestedDeploymentName-', uniqueString(deployment().name))]用作巢狀部署名稱的一部分。
備註
屬性內
deployment的所有函式都會評估為範本的元件,而不是原則。 例外狀況是parameters將值從原則傳遞至範本的屬性。 在本節中,範本參數名稱下的value用於執行此值的傳遞(請參閱 DeployIfNotExists 範例中的 fullDbName)。- 此屬性應該包含完整的範本部署,因為它會傳遞至
DeployIfNotExists 範例
範例:評估 SQL Server 資料庫,以判斷是否 transparentDataEncryption 已啟用。 如果未啟用,則會執行部署來進行啟用。
"if": {
"field": "type",
"equals": "Microsoft.Sql/servers/databases"
},
"then": {
"effect": "deployIfNotExists",
"details": {
"type": "Microsoft.Sql/servers/databases/transparentDataEncryption",
"name": "current",
"evaluationDelay": "AfterProvisioning",
"roleDefinitionIds": [
"/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/{roleGUID}",
"/providers/Microsoft.Authorization/roleDefinitions/{builtinroleGUID}"
],
"existenceCondition": {
"field": "Microsoft.Sql/transparentDataEncryption.status",
"equals": "Enabled"
},
"deployment": {
"properties": {
"mode": "incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"fullDbName": {
"type": "string"
}
},
"resources": [
{
"name": "[concat(parameters('fullDbName'), '/current')]",
"type": "Microsoft.Sql/servers/databases/transparentDataEncryption",
"apiVersion": "2014-04-01",
"properties": {
"status": "Enabled"
}
}
]
},
"parameters": {
"fullDbName": {
"value": "[field('fullName')]"
}
}
}
}
}
}
後續步驟
- 在 Azure 原則範例檢閱範例。
- 檢閱 Azure 原則定義結構。
- 了解如何以程式設計方式建立原則。
- 了解如何取得合規性資料。
- 瞭解如何 補救不符合規範的資源。
- 檢閱 Azure 管理群組。