Добавьте правило Url в шлюз приложений Azure из другого шаблона ARM
У меня есть шаблон ARM группы ресурсов, который я использую для создания шлюза приложения, настроенного для URL-маршрутизации. Он отправляет трафик различным веб-приложениям в этой группе ресурсов на основе правил пути URL. Я развертываю шаблон ARM базовой группы ресурсов, а затем каждое веб-приложение имеет свой собственный шаблон ARM, который настраивает веб-приложение в плане обслуживания приложений. Я пытаюсь выяснить, как добавить правило к существующей карте пути URL-адреса на шлюзе приложений, не определяя весь шлюз приложений в каждом шаблоне. Таким образом, я могу просто добавить веб-приложения и заставить их "зарегистрироваться" на шлюзе приложений с определенным правилом пути.
Я подумал о создании связанного шаблона, в котором мой базовый шаблон будет иметь все общие ресурсы (базы данных, план обслуживания приложения и шлюз приложения), но даже при наличии связанного шаблона я не думаю, что смогу добавить правило в шлюз приложения.,
Обновление Итак, я изменил свой шаблон, добавив ссылку на существующий шлюз приложения, а затем добавив переменные для нового BackEndPoolAddress и нового правила пути. Это заканчивается так (сокращенно только соответствующие части):
"variables": {
"appGateway": "[reference(concat('Microsoft.Network/applicationGateways/', 'appGateWay-', uniqueString(resourceGroup().id)), '2017-06-01')]",
"pathRule": {
"name": "[concat(parameters('websiteName'), '- RoutingRule')]",
"properties": {
"paths": [
"[parameters('routingRule')]"
],
"backendAddressPool": {
"id": "[concat(variables('appGateway').id, '/backendAddressPools/',parameters('websiteName'), 'BackEndPool')]"
},
"backendHttpSettings": {
"id": "[variables('appGateway').backendHttpSettingsCollection[0]]"
}
}
},
"backendPool": {
"name": "[concat(parameters('websiteName'), 'BackEndPool')]",
"properties": {
"IpAddress": "[reference(variables('webSiteName')).defaultHostName]"
}
}
},
"resources": [
...
{
"apiVersion": "2017-06-01",
"name": "[variables('appGateway').name]",
"type": "Microsoft.Network/applicationGateways",
"location": "[resourceGroup().location]",
"properties": {
"backendAddressPools": "[concat(variables('appGateway').backendAddressPools, variables('backendPool'))]",
"urlPathMaps": [
{
"name": "[variables('appGateway').urlPathMaps[0]]",
"pathRules": "[concat(variables('appGateway').urlPathMaps[0].pathRules, variables('pathRule'))]"
}
]
}
}
],
Однако я получаю ошибку проверки шаблона, говоря, что не могу использовать функцию Reference в разделе Variables. Если я не добавлю его в раздел переменных, как я могу построить правильные пути для пула и pathRule в разделе переменных?
1 ответ
Вы можете достичь этого с помощью reference()
функция, манипулирование массивами и вложенные шаблоны (могут работать даже без них, в худшем случае они вам понадобятся). пример:
"outputs": {
"httpListeners": {
"type": "array",
"value": "[reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners]"
}
}
Вернет вам массив или httpListeners. вы можете получить все соответствующие свойства шлюза приложения и добавить новые (дополнительные) свойства с помощью concat()
и присвойте результат свойству (свойствам):
"httpListeners": "[concat(reference('application_gateway_id', '2018-08-01', 'Full').properties.httpListeners, variables('newListener'))]"
вам просто нужно убедиться, что 2 развертывания не запускаются одновременно, одно может перезаписать другое
Вот решение, которое я наконец-то использовал с помощью интерфейса командной строки Azure. Этот скрипт идемпотентен и запускается во время моего релиза.
echo "Logging into AKS Cluster"
az aks get-credentials --resource-group $RESOURCEGROUP_NAME --name $AKSNAME
echo "Get the created service's ip address"
SERVICEIP=$(kubectl get service --namespace $AKSNAMESPACE $APPNAME-service -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
echo "Creating backend pool - IP $SERVICEIP"
az network application-gateway address-pool create \
--gateway-name $APPGATEWAYNAME \
--resource-group $RESOURCEGROUP_NAME \
--name "$APPNAME-pool" \
--servers $SERVICEIP
echo "Creating probe"
az network application-gateway probe create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-probe" \
--path $APPPROBE \
--resource-group $RESOURCEGROUP_NAME \
--protocol Http \
--resource-group $RESOURCEGROUP_NAME \
--host-name-from-http-settings true
echo "Creating HTTP Settings"
az network application-gateway http-settings create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-settings" \
--port 80 \
--resource-group $RESOURCEGROUP_NAME \
--host-name-from-backend-pool \
--probe "$APPNAME-probe" \
--protocol Http
echo "Creating URL Path Map"
az network application-gateway url-path-map rule create \
--gateway-name $APPGATEWAYNAME \
--name "$APPNAME-rule" \
--paths $RULEPATH \
--path-map-name $RULENAME \
--resource-group $RESOURCEGROUP_NAME \
--http-settings "$APPNAME-settings" \
--address-pool "$APPNAME-pool"