функция 'ресурс' оценивает в любом случае и терпит неудачу

У меня есть родительский шаблон ARM (например: app.assembly.json), который

  • принимает несколько параметров, в том числе:

    • hostBindingName
    • certificatePfxBase64

затем, позже, раздел resources вызывает несколько связанных шаблонов, каждый из которых является одним файлом, ориентированным на выделение одного ресурса.

  • web.server.json,
  • web.site.json,
  • web.certificate.json,
  • `web.site.hostnamebinding.json '
  • и Т. Д.

Есть зависимости, такие что

  • web.site.hostnamebinding dependsOn web.site и (необязательно) web.certificate.

Проблема в необязательном сертификате:

  • никто не хочет запускать шаблон сертификата, если нет base64 pfx для его предоставления ....
  • но привязка имени хоста может продолжаться, если есть имя хоста - просто невозможно предоставить параметры сертификата, такие как отпечаток и т. д., если сертификат не был установлен.

Первая попытка: условный сертификат + динамическое свойство dependsOn в привязке имени хоста.

Первый подход заключался в том, чтобы поместить conditional в родительский app.assembly.json в ссылку на ресурс сертификата, чтобы, если pfxBlob64 был пустым, не вызывать связанный шаблон.

Поскольку шаблон теперь был необязательным, ушел, чтобы сделать ресурс hostnameBindings зависимымOn условным, что-то вроде следующего псевдокода:

dependsOn: ...if (pfxBase64, array('website', 'certificate'), array('website')

Но это дало ошибку, говоря, что он не может преобразовать массив в строку [] ...

Я сдался.

Второй подход: удалите условное выражение из ссылки верхнего уровня на связанный шаблон и поместите условие внутри связанного шаблона

Второй подход заключался в том, чтобы заставить оба связанных шаблона работать в любом направлении - устраняя необходимость в динамическом dependsOn - или просто помещать условную логику в ресурс внутри связанного шаблона.

Теперь ... Последний трюк, верните из вложенного шаблона отпечаток пальца.

Следующее должно сработать. сделал ли я сертификат или нет. Он работает, когда я предоставляю pfxBase64 ... но не работает, когда он не предоставляется.

После некоторого расследования выяснилось, что reference оценивается в любом случае.

Любые рекомендации по другому подходу?

  "value":"[if (variables('web').certificate.conditionalFlag ,  reference(resourceId(variables('web').certificate.resourceType, variables('web').certificate.resourceName), '2015-08-01', 'Full').properties.thumbprint ,'')]"

.

Третий подход: повторяющиеся, но немного отличающиеся связанные шаблоны

Другой вариант, о котором я думаю, - это вернуть только resourceId. А затем используйте два разных дочерних шаблона для сертификатов. Тот, который устанавливает SSL, и тот, который не устанавливает параметры SSL ... и только в дочернем шаблоне настройки SSL, используйте метод resource (). Это кажется настолько запутанным хаком, что я был бы признателен за альтернативное предложение, прежде чем я попробую этот беспорядочный подход.

Дополнение:

Четвертый подход:

В настоящее время я иду по пути создания двух дочерних шаблонов и использования динамического пути, переключаясь между ними в зависимости от заданного условия:

  • web.certificate.json, который вызывает ресурсы, но это нормально, поскольку был предоставлен pfxBase64.
  • web.certificate.null.json, который просто возвращает ""

Вроде работает :-)


person user9314395    schedule 22.03.2018    source источник


Ответы (1)


Вы действительно ничего не можете с этим поделать. Шаблоны ARM в большинстве случаев крайне глупы. Обе стороны if() оцениваются и должны существовать.

кроме того, у вас не может быть выражений для dependsOn (еще одно чрезвычайно глупое ограничение).

Что касается вашей проблемы, вы должны передать certificatePfxBase64 вложенному шаблону (даже если он пуст), и если он пуст, не создавать сертификат. поэтому используйте json('null') вместо ''.

person 4c74356b41    schedule 22.03.2018
comment
Спасибо. Хорошие идеи. В итоге я установил сертификат на всех сайтах. (доказывая, что он работал в ST / UAT) и выполнял только привязку имени хоста (который не генерирует вывод) в PROD .. Да ... они действительно очень глупы большую часть времени ;-) Я никогда не находил способ условно создайте новый ресурс (storageAccount), а затем условно укажите на него, чтобы добавить ключи в хранилище ключей, только если оно было создано. Ездит мне батсо. - person user9314395; 01.06.2018