从其他ARM模板将Url规则添加到Azure应用程序网关

从其他ARM模板将Url规则添加到Azure应用程序网关,azure,arm-template,azure-application-gateway,azure-template,Azure,Arm Template,Azure Application Gateway,Azure Template,我有一个资源组ARM模板,用于创建为url路由配置的应用程序网关。它根据url路径规则向该资源组中的不同Web应用发送流量。我部署基本资源组ARM模板,然后每个web应用程序都有自己的ARM模板,用于在应用程序服务计划中设置web应用程序。我试图弄清楚如何在应用程序网关上向现有Url路径映射添加规则,而不必在每个模板中定义整个应用程序网关。这样,我就可以简单地添加web应用程序,并使用特定的路径规则将它们“注册”到应用程序网关 我曾考虑过在我的基本模板拥有所有共享资源(数据库、应用服务计划和应用

我有一个资源组ARM模板,用于创建为url路由配置的应用程序网关。它根据url路径规则向该资源组中的不同Web应用发送流量。我部署基本资源组ARM模板,然后每个web应用程序都有自己的ARM模板,用于在应用程序服务计划中设置web应用程序。我试图弄清楚如何在应用程序网关上向现有Url路径映射添加规则,而不必在每个模板中定义整个应用程序网关。这样,我就可以简单地添加web应用程序,并使用特定的路径规则将它们“注册”到应用程序网关

我曾考虑过在我的基本模板拥有所有共享资源(数据库、应用服务计划和应用网关)的情况下使用链接模板,但即使使用链接模板,我认为我也无法向应用网关添加规则

更新 因此,我修改了模板,添加了对现有应用程序网关的引用,然后为新的BackEndPoolAddress和新的路径规则添加了变量。结果如下(仅缩写为相关部分):


但是,我得到一个模板验证错误,说我不能使用变量部分中的引用函数。如果我没有将其添加到变量部分,如何在变量部分为池和pathRule构建正确的路径

您可以使用
reference()
函数、数组操作和嵌套模板来实现这一点(即使没有这些模板也可以工作,最坏的情况是您需要它们)。例如:

"outputs": {
    "httpListeners": {
        "type": "array",
        "value": "[reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners]"
    }
}
将返回数组或httpListeners。您可以使用
concat()
获取所有相关的应用程序网关属性,添加新的(附加)属性,并将结果分配给属性(属性):


您只需确保两个部署不会同时启动,一个可能会覆盖另一个

以下是我最终使用Azure CLI的解决方案。此脚本是幂等的,在发布过程中运行

echo“登录AKS群集”
az aks获取凭据--资源组$RESOURCEGROUP_NAME--名称$AKSNAME
echo“获取创建的服务的ip地址”
SERVICEIP=$(kubectl获取服务--命名空间$AKSNAMESPACE$APPNAME服务-o jsonpath=“{.status.loadBalancer.ingress[0].ip}”)
echo“创建后端池-IP$SERVICEIP”
az网络应用程序网关地址池创建\
--网关名称$APPGATEWAYNAME\
--资源组$RESOURCEGROUP\u名称\
--名称“$APPNAME池”\
--服务器$SERVICEIP
回声“创建探针”
az网络应用程序网关探测器创建\
--网关名称$APPGATEWAYNAME\
--名称“$APPNAME探测器”\
--路径$APPPROBE\
--资源组$RESOURCEGROUP\u名称\
--协议Http\
--资源组$RESOURCEGROUP\u名称\
--http设置中的主机名为true
echo“创建HTTP设置”
az网络应用程序网关http设置创建\
--网关名称$APPGATEWAYNAME\
--名称“$APPNAME设置”\
--端口80\
--资源组$RESOURCEGROUP\u名称\
--来自后端池的主机名\
--探测“$APPNAME探测”\
--协议Http
echo“创建URL路径映射”
az网络应用程序网关url路径映射规则创建\
--网关名称$APPGATEWAYNAME\
--名称“$APPNAME规则”\
--路径$RULEPATH\
--路径映射名称$RULENAME\
--资源组$RESOURCEGROUP\u名称\
--http设置“$APPNAME设置”\
--地址池“$APPNAME池”

最终不得不使用嵌套模板路线,但这让我找到了正确的方向。谢谢,你好,迈克。您可以分享一些关于如何通过嵌套模板路由使其工作的见解吗。我尝试使用嵌套模板实现以下功能:为每个应用程序创建一个单独的模板文件,并从主应用程序调用所有模板文件。谢谢你的帮助。谢谢。@Avi我最近实际上从ARM切换到了CLI,所以我不再有那个代码了,但使用CLI真的很容易,因为它是幂等的。我将在下面添加一个答案,说明我如何使用一个简单的Azure CLI脚本更新负载平衡器,该脚本在每次部署运行时都会运行。
"outputs": {
    "httpListeners": {
        "type": "array",
        "value": "[reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners]"
    }
}
"httpListeners": "[concat(reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners, variables('newListener'))]"