你当前正在访问 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)
。
原始 firstVNet
已更新而非重新创建。 如果 firstVNet
是重新创建的,则 nic1
不会与 firstVNet
相关联。
后续步骤
- Azure Resource Manager
- 什么是 ARM 模板?
- 教程:创建和部署你的第一个 ARM 模板
- 教程:将资源添加到 ARM 模板
- ARM 模板最佳做法
- Azure 资源管理器文档
- ARM 模板文档