Azure Policy 定义 deployIfNotExists 效果

auditIfNotExists 类似,deployIfNotExists 策略定义在条件满足时将执行模板部署。 效果设置为 DeployIfNotExists 的策略分配需要使用托管标识进行修正。

注意

deployIfNotExists 支持嵌套模板,但目前不支持链接模版

DeployIfNotExists 评估

在资源提供程序处理创建或更新订阅或资源请求并返回成功状态代码时,deployIfNotExists 会在可配置的延迟之后运行。 如果没有相关资源或如果由 existenceCondition 定义的资源未评估为 true,则会发生模板部署。 部署持续时间取决于模板中包含资源的复杂性。

在评估周期中,具有与资源匹配的 DeployIfNotExists 效果的策略定义被标记为不合规,但不对该资源执行任何操作。 使用修正任务来修正现有不符合资源。

DeployIfNotExists 属性

DeployIfNotExists 效果的 details 属性具有定义要匹配的相关资源和要执行的模板部署的所有子属性。

  • type(必需)
    • 指定要匹配的相关资源的类型。
    • 如果 typeif 条件资源下的一个资源类型,则策略会在已评估资源范围内查询此 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/?"。 这可以与 field 函数结合使用,来访问与所评估的资源相关的资源,例如 "name": "[concat(field('name'), '/?')]"。”

  • resourceGroupName(可选)

    • 允许相关资源的匹配来自不同的资源组。
    • typeif 条件资源下的一个资源,则不适用。
    • 默认值是 if 条件资源的资源组。
    • 如果执行模板部署,则将其部署在此值的资源组中。
  • existenceScope(可选)

    • 允许的值为 Subscription 和 ResourceGroup。
    • 设置从中获取相关资源以在其中进行匹配的范围。
    • typeif 条件资源下的一个资源,则不适用。
    • 对于 ResourceGroup,将限制为 resourceGroupName 中的资源组(如果指定)。 如果未指定 resourceGroupName,则将默认限制为 if 条件资源的资源组。
    • 对于 Subscription,则查询全部订阅以获取相关资源。 应在订阅或更高级别设置分配范围,以便进行正确评估。
    • 默认值是 ResourceGroup。
  • evaluationDelay(可选)

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

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

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

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

后续步骤