共用方式為


Azure 原則定義的 deployIfNotExists 效果

auditIfNotExists類似,原則 deployIfNotExists 定義會在符合條件時執行範本部署。 將效果設定為 DeployIfNotExists 的原則指派需要受控識別動作補救。

備註

支援巢狀模板deployIfNotExists,但目前不支援連結的模板

DeployIfNotExists 評估

deployIfNotExists 會在資源提供者處理建立或更新訂閱或資源要求並傳回成功狀態代碼後,經過可設定的延遲後執行。 如果沒有相關資源,或是由 existenceCondition 所定義的資源未被評估為 true,就會進行範本部署。 部署的持續時間取決於範本所含資源的複雜度。

在評估循環期間,符合 DeployIfNotExists 效果的資源會被標示為不合規,但不會對該資源採取任何動作。 現有的不符合規範的資源可以透過 補救工作進行修正。

DeployIfNotExists 屬性

DeployIfNotExists 效果的 details 屬性具有定義要比對的相關資源以及要執行的範本部署的所有子屬性。

  • type (必要)
    • 指定要比對之相關資源的型別。
    • 如果 type 是條件資源下 if 的資源類型,則原則會在評估的資源範圍內查詢此 type 資源。 否則,原則會在與受評估資源相同的資源群組或訂用帳戶內查詢 (視 existenceScope 而定)。
  • name (選擇性)
    • 指定要比對的資源確切名稱,並讓原則擷取一個特定資源,而不是指定類型的所有資源。
    • if.field.typethen.details.type的條件值匹配時,name 就會變成必要,且必須是 [field('name')],或者 [field('fullName')] 子資源。

備註

typename 區段可以合併以通用方式擷取巢狀資源。

若要擷取特定資源,您可以使用 "type": "Microsoft.ExampleProvider/exampleParentType/exampleNestedType""name": "parentResourceName/nestedResourceName"

若要擷取巢狀資源的集合,可以提供通配符 ? 來取代最後一個區段。 例如,"type": "Microsoft.ExampleProvider/exampleParentType/exampleNestedType""name": "parentResourceName/?"。 這可以與欄位函式結合,以存取與評估資源相關的資源,例如 "name": "[concat(field('name'), '/?')]"

  • resourceGroupName (選用)

    • 允許比對來自不同資源群組的相關資源。
    • 如果 type 是條件資源底下 if 的資源,則不適用。
    • 預設值為 if 條件資源的資源群組。
    • 如果執行範本部署,則會部署在此值的資源群組中。
  • existenceScope (選用)

    • 允許的值為 SubscriptionResourceGroup
    • 設定要從何處擷取要比對之相關資源的範圍。
    • 如果 type 是條件資源底下 if 的資源,則不適用。
    • 針對 ResourceGroup,如果有指定,則會限制在 resourceGroupName 資源群組之中。 resourceGroupName 未指定時,將限制至條件 if 資源的資源群組,這是預設行為。
    • 針對 [訂用帳戶],查詢相關資源的整個訂用帳戶。 指派範圍應該在訂閱層級或更高層級設定,才能進行適當的評估。
    • 預設值為 ResourceGroup
  • evaluationDelay (選用)

    • 指定何時應該評估相關資源的存在狀態。 延遲僅適用於建立或更新資源要求結果的評估。
    • 允許的值為 AfterProvisioningAfterProvisioningSuccessAfterProvisioningFailure或 ISO 8601 持續時間,介於 0 到 360 分鐘之間。
    • AfterProvisioning 值會檢視在原則規則if條件中所評估的資源布建結果。 AfterProvisioning 在布建完成之後執行,不論結果為何。 如果佈建時間超過 6 小時,則判斷 AfterProvisioning 評估延遲時,會將其視為失敗。
    • 預設值為 PT10M (10 分鐘)。
    • 若指定長時間的評估延遲,可能會導致記錄的資源合規性狀態在下次評估觸發程序之前不會更新。
  • existenceCondition (選用)

    • 如果未指定,則任何相關資源 type 都符合效果,且不會觸發部署。
    • 使用與條件原則規則 if 相同的語言,但會個別針對每個相關資源進行評估。
    • 如果有任何相符的相關資源評估為 true,便可滿足此效果,而不會觸發部署。
    • 可以使用 [field()] 來檢查條件中的 if 值是否相等。
    • 例如,可用來驗證父資源 (條件中 if ) 是否與比對相關資源位於相同的資源位置。
  • roleDefinitionIds (必要)

    • 此屬性必須包含與訂用帳戶可存取之角色型存取控制角色識別碼相符的字串陣列。 如需詳細資訊,請參閱補救 - 設定原則定義
  • deploymentScope (選用)

    • 允許的值為 SubscriptionResourceGroup
    • 設定要觸發的部署類型。 訂閱 指的是訂閱層級的部署,ResourceGroup 指的是資源群組的部署。
    • 使用訂用帳戶層級部署時,必須在部署中指定location屬性。
    • 預設值為 ResourceGroup
  • deployment (必要)

    • 此屬性應該包含完整的範本部署,因為它會傳遞至 Microsoft.Resources/deployments PUT 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')]"
          }
        }
      }
    }
  }
}

後續步驟