У меня есть родительский шаблон 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
был пустым, не вызывать связанный шаблон.
Поскольку шаблон теперь был необязательным, ушел, чтобы сделать ресурс hostnameBinding
s зависимым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
, который просто возвращает ""
Вроде работает :-)