Добавление правила 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'))]"
          }
        ]
      }
    }
  ],

Однако я получаю сообщение об ошибке проверки шаблона, в котором говорится, что я не могу использовать функцию ссылки в разделе переменных. Если я не добавлю его в раздел переменных, как я могу построить правильные пути для пула и pathRule в разделе переменных?


person Mike    schedule 26.01.2019    source источник
comment
Привет Майк. Не могли бы вы поделиться некоторыми идеями о том, как вы добились его работы с помощью вложенного шаблона маршрута. Я пытаюсь достичь следующего, используя вложенный шаблон: иметь отдельный файл шаблона для каждого приложения и вызывать их все из основного. Любая помощь приветствуется. Спасибо.   -  person Avi    schedule 19.08.2019
comment
@Avi Я действительно недавно переключился с ARM на CLI, поэтому у меня больше нет этого кода, но это было действительно легко сделать с помощью CLI, потому что он идемпотентен. Я добавлю ответ ниже, показывающий, как я обновляю свой балансировщик нагрузки с помощью простого сценария Azure CLI, который запускается при каждом запуске моего развертывания.   -  person Mike    schedule 20.08.2019


Ответы (2)


вы можете добиться этого, используя функцию 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 развертывания не запускаются одновременно, одно может перезаписать другое

person 4c74356b41    schedule 26.01.2019
comment
В итоге пришлось пойти по маршруту вложенного шаблона, но это указывало мне в правильном направлении. Спасибо. - person Mike; 29.01.2019

Вот решение, которое я наконец выбрал, используя Azure CLI. Этот сценарий идемпотентен и выполняется во время моего выпуска.

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"
person Mike    schedule 20.08.2019