如何通过ARM模板更新Azure负载均衡器,保留旧规则新增探测与规则?
可以通过ARM模板增量更新Azure Load Balancer,无需覆盖原有规则/探测
当然可以!你遇到的问题是因为当前模板重新定义了LoadBalancer的frontendIPConfigurations和backendAddressPools属性,这会覆盖LB上原有的对应配置,而且默认情况下如果模板中没有包含原有探测/规则,ARM不会保留它们——但其实我们可以用增量部署模式,只定义需要新增的资源部分,完全不干扰原有配置。
核心要点
- 使用增量部署模式:ARM默认就是增量模式,但一定要确保部署时没有指定
Complete模式(该模式会删除模板中未定义的所有资源)。 - 不要重复定义原有属性:模板中只需要包含你要新增的
probes或loadBalancingRules,不要重新写frontendIPConfigurations、backendAddressPools这些已经存在的配置,避免覆盖。
修正后的模板示例(仅新增健康探测)
下面的模板只会给现有LB添加新的健康探测,完全保留原有配置:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "lbName": { "type": "string" }, "lbLocation": { "type": "string" }, "newHealthProbes": { "type": "array", "defaultValue": [ { "name": "HealthProbe-TCP-8080", "protocol": "TCP", "port": 8080, "intervalInSeconds": 15, "numberOfProbes": 2, "requestPath": null } ] } }, "resources": [ { "apiVersion": "2023-05-01", // 建议使用最新API版本 "name": "[parameters('lbName')]", "type": "Microsoft.Network/loadBalancers", "location": "[parameters('lbLocation')]", "properties": { "copy": [ { "name": "probes", "count": "[length(parameters('newHealthProbes'))]", "input": { "name": "[parameters('newHealthProbes')[copyIndex('probes')].name]", "properties": { "protocol": "[parameters('newHealthProbes')[copyIndex('probes')].protocol]", "port": "[parameters('newHealthProbes')[copyIndex('probes')].port]", "intervalInSeconds": "[parameters('newHealthProbes')[copyIndex('probes')].intervalInSeconds]", "numberOfProbes": "[parameters('newHealthProbes')[copyIndex('probes')].numberOfProbes]", "requestPath": "[parameters('newHealthProbes')[copyIndex('probes')].requestPath]" } } } ] } } ] }
新增负载均衡规则的模板示例
如果要新增LB规则,只需要在properties中添加loadBalancingRules的copy块,同样不需要覆盖原有配置:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "lbName": { "type": "string" }, "lbLocation": { "type": "string" }, "backendPoolName": { "type": "string" }, // 指定现有后端池名称 "newLbRules": { "type": "array", "defaultValue": [ { "name": "LBRule-TCP-8080", "protocol": "Tcp", "frontendPort": 8080, "backendPort": 8080, "probeName": "HealthProbe-TCP-8080" // 可以是现有或刚新增的探测 } ] } }, "resources": [ { "apiVersion": "2023-05-01", "name": "[parameters('lbName')]", "type": "Microsoft.Network/loadBalancers", "location": "[parameters('lbLocation')]", "properties": { "copy": [ { "name": "loadBalancingRules", "count": "[length(parameters('newLbRules'))]", "input": { "name": "[parameters('newLbRules')[copyIndex('loadBalancingRules')].name]", "properties": { "protocol": "[parameters('newLbRules')[copyIndex('loadBalancingRules')].protocol]", "frontendPort": "[parameters('newLbRules')[copyIndex('loadBalancingRules')].frontendPort]", "backendPort": "[parameters('newLbRules')[copyIndex('loadBalancingRules')].backendPort]", "frontendIPConfiguration": { "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('lbName')), '/frontendIPConfigurations/LoadBalancerFrontEnd')]" }, "backendAddressPool": { "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('lbName')), '/backendAddressPools/', parameters('backendPoolName'))]" }, "probe": { "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('lbName')), '/probes/', parameters('newLbRules')[copyIndex('loadBalancingRules')].probeName)]" }, "enableFloatingIP": false, "idleTimeoutInMinutes": 4 } } } ] } } ] }
部署命令示例
确保用增量模式部署,比如使用Azure CLI:
az deployment group create --resource-group your-resource-group-name --template-file ./your-template.json --mode Incremental --parameters lbName=your-lb-name lbLocation=eastus
或者PowerShell:
New-AzResourceGroupDeployment -ResourceGroupName your-resource-group-name -TemplateFile ./your-template.json -Mode Incremental -lbName your-lb-name -lbLocation eastus
关键提醒
- 不要在模板中包含LB已有的
frontendIPConfigurations、backendAddressPools等属性,否则会覆盖原有配置。 - 使用最新的API版本(比如
2023-05-01),避免兼容性问题。 - 新增规则时,要确保引用的后端池、健康探测已经存在(可以是原有资源或本次模板新增的)。
内容的提问来源于stack exchange,提问作者Dilly B
相关产品推荐
相关产品推荐

