你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

了解 Azure 蓝图中的部署排序

重要

2026 年 7 月 11 日,蓝图(预览版)将弃用。 将现有蓝图定义和分配迁移到模板规格部署堆栈。 蓝图项目将转换为 ARM JSON 模板或用于定义部署堆栈的 Bicep 文件。 若要了解如何将项目创作为 ARM 资源,请参阅:

Azure 蓝图使用排序顺序来确定处理蓝图定义分配时资源创建的顺序。 本文解释了以下概念:

  • 使用的默认序列化顺序
  • 如何自定义顺序
  • 自定义顺序是如何处理的

JSON 示例中的有些变量需要用自己的值替换:

  • {YourMG} - 替换为管理组的名称

默认排序顺序

如果蓝图定义不包含用于部署项目的顺序的指令或指令为 NULL,则使用以下顺序:

  • 订阅级别“角色分配”项目按项目名称排序
  • 订阅级别“策略分配”项目按项目名称排序
  • 订阅级别“Azure 资源管理器模板”(ARM 模板)项目按项目名称排序
  • “资源组”项目(包括子项目)按占位符名称排序

在每个资源组项目中,将按照以下顺序排列在该资源组中创建的项目:

  • 资源组子“角色分配”项目按项目名称排序
  • 资源组子“策略分配”项目按项目名称排序
  • 资源组子“Azure 资源管理器模板”(ARM 模板)项目按项目名称排序

注意

使用 artifacts() 会对所引用的项目产生隐式依赖。

自定义排序顺序

在编撰大型蓝图定义时,可能需要按特定顺序来创建资源。 此方案的最常见使用模式发生在蓝图定义包含多个 ARM 模板时。 Azure 蓝图通过允许定义排序顺序来处理此模式。

排序是通过在 JSON 中定义 dependsOn 属性来实现的。 蓝图定义(用于资源组)和项目对象支持此属性。 dependsOn 是在创建特定项目之前需要创建的项目名称的字符串数组。

注意

创建蓝图对象时,每个项目资源都从文件名(如果使用 PowerShell)或 URL 终结点(如果使用 REST API)来获取其名称。 项目中的 resourceGroup 引用必须与蓝图定义中定义的那些项匹配。

示例 - 已排序的资源组

此示例蓝图定义具有一个通过声明 dependsOn 的值定义了自定义排序顺序的资源组,以及一个标准资源组。 在这种情况下,名为“assignPolicyTags”的项目将在“ordered-rg”资源组之前进行处理。 standard-rg 将按默认排序顺序进行处理

{
    "properties": {
        "description": "Example blueprint with custom sequencing order",
        "resourceGroups": {
            "ordered-rg": {
                "dependsOn": [
                    "assignPolicyTags"
                ],
                "metadata": {
                    "description": "Resource Group that waits for 'assignPolicyTags' creation"
                }
            },
            "standard-rg": {
                "metadata": {
                    "description": "Resource Group that follows the standard sequence ordering"
                }
            }
        },
        "targetScope": "subscription"
    },
    "type": "Microsoft.Blueprint/blueprints"
}

示例 - 使用自定义顺序的项目

此示例是一个策略项目,它依赖于一个 ARM 模板。 根据默认排序,策略项目将先于 ARM 模板创建。 此排序允许策略项目等待 ARM 模板完成创建。

{
    "properties": {
        "displayName": "Assigns an identifying tag",
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/2a0e14a6-b0a6-4fab-991a-187a4f81c498",
        "resourceGroup": "standard-rg",
        "dependsOn": [
            "customTemplate"
        ]
    },
    "kind": "policyAssignment",
    "type": "Microsoft.Blueprint/artifacts"
}

示例 - 依赖于资源组的订阅级别模板项目

此示例适用于在订阅级别部署的依赖于资源组的 ARM 模板。 在默认顺序中,将在任何资源组和那些资源组中的子项目之前创建订阅级别项目。 资源组在蓝图定义中定义,如下所示:

"resourceGroups": {
    "wait-for-me": {
        "metadata": {
            "description": "Resource Group that is deployed prior to the subscription level template artifact"
        }
    }
}

依赖于 wait-for-me 资源组的订阅级别模板项目的定义如下:

{
    "properties": {
        "template": {
            ...
        },
        "parameters": {
            ...
        },
        "dependsOn": ["wait-for-me"],
        "displayName": "SubLevelTemplate",
        "description": ""
    },
    "kind": "template",
    "type": "Microsoft.Blueprint/blueprints/artifacts"
}

处理自定义排序

在创建过程中,将使用拓扑排序来创建蓝图项目的依赖项关系图。 此检查可确保资源组与项目之间每个级别的依赖项都得到支持。

如果声明了不会更改默认顺序的依赖项,则不会进行任何更改。 一个示例是依赖于订阅级策略的资源组。 另一个示例是资源组“standard-rg”子策略分配,它依赖于资源组“standard-rg”子角色分配。 这两种情况下,dependsOn 都不会更改默认的排序顺序且不会进行任何更改。

后续步骤