【发布时间】:2018-03-22 00:53:34
【问题描述】:
我有一个父 ARM 模板(例如:app.assembly.json)
-
接受多个参数,包括:
hostBindingNamecertificatePfxBase64
然后,resources 部分调用多个链接模板,每个模板都是单个文件,专注于单个资源分配。
-
web.server.json, -
web.site.json, -
web.certificate.json, - `web.site.hostnamebinding.json'
- 等
有依赖关系,比如
-
web.site.hostnamebindingdependsOnweb.site,和(可选)web.certificate。
问题在于可选证书:
- 如果没有提供 base64 pfx 的证书模板,则不想运行它...。
- 但是如果有主机名,主机名绑定可以继续 - 如果没有安装证书,则无法提供证书参数,例如指纹等。
第一次尝试:条件证书 + 主机名绑定上的动态 dependsOn 属性。
第一种方法是在证书资源引用上的父 app.assembly.json 中放置一个 conditional,这样如果 pfxBlob64 为空,则不要调用链接模板。
由于模板现在是可选的,因此开始使hostnameBindings 资源的dependsOn 成为条件,类似于以下伪代码:
dependsOn: ...if (pfxBase64, array('website', 'certificate'), array('website')
但这给出了错误,说它无法将数组转换为字符串 []...
我放弃了。
第二种方法:将条件从对链接模板的顶级引用中取出,并将条件放在链接模板中
第二种方法是让两个链接模板都以任一方式运行——无需动态dependsOn——只需将条件逻辑放在链接模板中内的资源上。 p>
现在...最后一招,从嵌套模板中取回指纹。
以下应该有效。无论我是否做了证书。它在我提供 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,它只返回 ""
似乎工作:-)
【问题讨论】:
标签: azure-resource-manager arm-template