Итерация списка с использованием копии в ARM-шаблоне - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть шаблон ARM, в котором я предоставляю несколько веб-приложений.Я хочу добавить ограничения IP на эти веб-приложения, разрешающие доступ только между тезисами.Я могу получить IP-адреса, используя:

reference(resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('appName1')),'2015-08-01').PossibleOutboundIpAddresses

Это следующее, что я не знаю, как правильно решить.

  1. Я заменил resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('appName1')) часть с переменной вместо того, чтобы немного ее укоротить.Могу ли я сократить его еще как-нибудь?Это станет еще сложнее, как вы скоро увидите.

  2. Я создал раздел ресурсов для каждого веб-приложения, в котором есть раздел свойств.В этом разделе находится ipSecurityRestrictions.Поскольку возможный выходной адрес возвращает строку, я использую разделение для создания списка и копирования для итерации IP-адресов.Но он не работает для меня и возвращает следующее сообщение об ошибке: The template function 'copyIndex' is not expected at this location. The function can only be used in a resource with copy specified

Раздел выглядит так:

"resources": [
            {
                "type": "config",
                "name": "web",
                "apiVersion": "2016-08-01",
                "properties": {
                    "copy": [
                        {
                            "name": "ipSecurityRestrictions",
                            "count": "[length(split(reference(variables('appName1'),'2015-08-01').PossibleOutboundIpAddresses, ','))]",
                            "input": {
                                "ipAddress": "[split(reference(variables('appName1'),'2015-08-01').PossibleOutboundIpAddresses, ',')[copyIndex('ipSecurityRestrictions')]]",
                                "subnetMask": "255.255.255.254"
                            }
                        }
                    ],
                },
                "dependsOn": [
                    "[resourceId('Microsoft.Web/sites', parameters('appName1'))]"
                ]
            }
        ]

Я чувствую, что следую всемпримеры, которые я могу найти онлайн точно.Другая проблема с этим - много символов, которые мне придется писать каждый раз, когда я хочу обратиться к списку IP.Что еще хуже, этот список должен быть объединен со всеми предоставленными веб-приложениями.Поэтому, если у меня будет 3 веб-приложения, линия будет невероятно длинной и сложной.

Есть ли лучшее решение для этого?

1 Ответ

0 голосов
/ 22 ноября 2018

хорошо, первый вопрос: могу ли я сделать его короче.
ответ: это действительно зависит, судя по тому, что вы показываете, не совсем (вы можете отказаться от api-версии, если ресурсы находятся в одном шаблоне).

второй вопрос: функция шаблона 'copyIndex' не ожидается в этом месте.Функцию можно использовать только в ресурсе с указанной копией.
ответ: к сожалению, этого сделать нельзя (драма времени выполнения \ времени компиляции).Вам нужно использовать вложенные шаблоны для достижения того же результата.

третий вопрос: есть ли лучшее решение для этого?
ответ: возможно.Я бы создал все 3 веб-приложения как вложенное развертывание (НЕ встроенное) и вернул бы массив строк (аналогично тому, что вы делаете)

"outputs" : {
    "array": {
         "type": "array",
         "value": "[split(reference(variables('appName')]"
    }
}

, а затем обработал бы их за один запуск с помощью concatи что-то вроде того, что вы делаете (но это должно быть и во вложенном шаблоне).что-то вроде:

"[concat(reference('deployment1').outputs.array.value, reference('deployment2').outputs.array.value, reference('deployment3').outputs.array.value)]"

и затем во вложенном шаблоне вы можете сделать:

                "copy": [
                    {
                        "name": "ipSecurityRestrictions",
                        "count": "[length(parameters('myArray'))]",
                        "input": {
                            "ipAddress": "[parameters('myArray')[copyIndex('ipSecurityRestrictions')]]]",
                            "subnetMask": "255.255.255.254"
                        }
                    }
                ],
...