Share via


Azure 原則 定義 deployIfNotExists 效果

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

注意

巢狀範本支援 ,但目前不支援連結的範本deployIfNotExists

DeployIfNotExists 評估

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

在評估周期期間,具有 DeployIfNotExists 效果的原則定義會標示為不符合規範,但該資源上不會採取任何動作。 現有的不符合規範的資源可以使用補救工作來補救

DeployIfNotExists 屬性

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

  • type (必要)
    • 指定要比對之相關資源的型別。
    • 如果 type 是條件資源下 if 的資源類型,則原則會在評估的資源範圍內查詢此 type 資源。 否則,根據 ,在與評估的資源 existenceScope相同的資源群組或訂用帳戶內的原則查詢。
  • name (選擇性)
    • 指定要比對的資源確切名稱,並讓原則擷取一個特定資源,而不是指定類型的所有資源。
    • 當和 then.details.type 符合的條件值if.field.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 在布建完成之後執行,不論結果為何。 當判斷 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')]"
          }
        }
      }
    }
  }
}

下一步