Azure Policy 定义 deployIfNotExists 效果

与策略 auditIfNotExists定义类似, deployIfNotExists 在满足条件时执行模板部署。 将效果设置为 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(可选)

    • 应指定何时评估相关资源的存在性。 延迟仅用于作为创建或更新资源请求的结果的评估。
    • 允许的值为 AfterProvisioningAfterProvisioningSuccessAfterProvisioningFailure0 到 360 分钟之间的 ISO 8601 持续时间。
    • AfterProvisioning 值检查策略规则if条件中评估的资源的预配结果。 AfterProvisioning 预配完成后即运行,无论结果如何。 确定 AfterProvisioning 评估延迟时,用时超过 6 小时的预配会被视作失败。
    • 默认值为 PT10M (10 分钟)。
    • 指定长时间的评估延迟可能会导致资源记录的符合性状态在下次 评估触发器之前不会更新。
  • existenceCondition(可选)

    • 如果未指定,则任何与 type 相关的资源均符合条件,并且不会触发部署。
    • 使用与 if 条件的策略规则相同的语言,但会分别针对每个相关资源进行评估。
    • 如果任何匹配的相关资源评估结果为 true,该效果就会得到满足并且不会触发部署。
    • 可以使用 [field()] 检查条件中的 if 值的等效性。
    • 例如,可用于验证父资源(条件 if 中)是否与匹配相关资源位于同一资源位置。
  • roleDefinitionIds(必需)

    • 此属性必须包含与可通过订阅访问的基于角色的访问控制角色 ID 匹配的字符串数组。 有关详细信息,请参阅修正 - 配置策略定义。
  • deploymentScope(可选)

    • 允许的值是 Subscription 和 ResourceGroup。
    • 设置要触发的部署类型。 订阅 指示 订阅级别的部署 , ResourceGroup 指示对资源组的部署。
    • 使用订阅级别部署时,必须在部署中指定位置属性。
    • 默认值为 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')]"
          }
        }
      }
    }
  }
}

后续步骤