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

在 Azure 资源管理器模板上更新资源

有时可能需要在部署时更新资源,例如,在创建某个资源的其他依赖资源之前无法指定资源的所有属性这种情况。 例如,如果为负载均衡器创建后端池,则可以更新虚拟机 (VM) 上的网络接口 (NIC) 来将其包括在后端池中。 资源管理器支持在部署期间更新资源,但必须正确设计模板以避免错误并确保将部署作为更新进行处理。

如果创建资源并在以后进行更新,则会引用它两次。 首先在创建它的模板中引用。 稍后在更新资源时会使用同一名称引用。 不过,如果两个资源在模板中具有相同的名称,则 Resource Manager 将引发异常。 若要避免此错误,请在所链接或包括为子模板(该模板使用 Microsoft.Resources/deployments 资源类型)的另一个模板中指定更新的资源。

在第二个模板中,必须指定要更改的属性的名称或者要添加的属性的新名称。 还必须指定不会更改的属性的名称和原始值。 如果无法指定一个或多个原始属性,则资源管理器会假定想要创建新资源并将删除原始资源。

示例模板

下面看一下演示此方法的示例模板。 模板部署一个名为 firstVNet 的虚拟网络,其中包含一个名为 firstSubnet 的子网。 然后,它将部署一个名为 nic1 的虚拟网络接口 (NIC) 并将 NIC 与该子网相关联。 一个名为 updateVNet 的部署资源包括通过添加另一个名为 secondSubnet 的子网来更新 firstVNet 的嵌套模板。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "resources": [
        {
            "apiVersion": "2020-05-01",
            "name": "firstVNet",
            "location": "[resourceGroup().location]",
            "type": "Microsoft.Network/virtualNetworks",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "10.0.0.0/22"
                    ]
                },
                "subnets": [
                    {
                        "name": "firstSubnet",
                        "properties": {
                            "addressPrefix": "10.0.0.0/24"
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "2020-05-01",
            "type": "Microsoft.Network/networkInterfaces",
            "name": "nic1",
            "location": "[resourceGroup().location]",
            "dependsOn": [
                "firstVNet"
            ],
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'firstVNet', 'firstSubnet')]"
                            }
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "2020-06-01",
            "type": "Microsoft.Resources/deployments",
            "name": "updateVNet",
            "dependsOn": [
                "nic1"
            ],
            "properties": {
                "mode": "Incremental",
                "parameters": {},
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.1",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "apiVersion": "2020-05-01",
                            "name": "firstVNet",
                            "location": "[resourceGroup().location]",
                            "type": "Microsoft.Network/virtualNetworks",
                            "properties": {
                                "addressSpace": "[reference('firstVNet').addressSpace]",
                                "subnets": [
                                    {
                                        "name": "[reference('firstVNet').subnets[0].name]",
                                        "properties": {
                                            "addressPrefix": "[reference('firstVNet').subnets[0].properties.addressPrefix]"
                                        }
                                    },
                                    {
                                        "name": "secondSubnet",
                                        "properties": {
                                            "addressPrefix": "10.0.1.0/24"
                                        }
                                    }
                                ]
                            }
                        }
                    ],
                    "outputs": {}
                }
            }
        }
    ],
    "outputs": {}
}

请考虑 firstVNet 资源的资源对象。 请注意,我们将再次指定嵌套模板中 firstVNet 的设置 - 这是因为资源管理器不允许同一个模板中有相同的部署名称,而嵌套模板被视为不同的模板。 通过重新指定 firstSubnet 资源的值,我们将指示资源管理器更新现有资源,而不是将其删除并重新部署。 最后,在此更新期间采用 secondSubnet 的新设置。

尝试模板

GitHub 上提供了一个示例模板。 若要部署该模板,请运行以下 Azure CLI 命令:

az group create --location <location> --name <resource-group-name>
az deployment group create -g <resource-group-name> \
    --template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example1-update/deploy.json

在部署完成后,打开在门户中指定的资源组。 将看到名为 firstVNet 的虚拟网络和名为 nic1 的 NIC。 单击 firstVNet,并单击 subnets。 会看到原来创建的 firstSubnet,还会看到已在 updateVNet 资源中添加的 secondSubnet

原始子网和更新后的子网

然后,返回到资源组并单击 nic1,然后单击 IP configurations。 在 IP configurations 部分中,subnet 设置为 firstSubnet (10.0.0.0/24)

nic1 IP 配置设置

原始 firstVNet 已更新而非重新创建。 如果 firstVNet 是重新创建的,则 nic1 不会与 firstVNet 相关联。

后续步骤