'resource' 函数以任何一种方式计算并失败

'resource' function evaluates either way and fails

我有一个父 ARM 模板(例如:app.assembly.json

然后,resources 部分调用多个链接模板,每个模板都是单个文件,专注于单个资源分配。

存在依赖关系,例如

问题是可选证书:

第一次尝试:条件证书 + 动态依赖 属性 主机名绑定。

第一种方法是在证书资源引用的父级 app.assembly.json 中放置一个 conditional,这样如果 pfxBlob64 为空,则不会调用链接的模板。

由于模板现在是可选的,所以开始使 hostnameBindings 资源的 dependsOn 有条件,类似于以下伪代码:

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 ,'')]"

.

第三种方法:重复但略有不同的链接模板

我正在考虑的另一个选择是 return 只是 resourceId。 然后为证书使用两个不同的子模板。一种设置 SSL,一种不设置 SSL 参数……并且仅在 SSL 设置子模板中使用 resource() 方法。 这感觉太复杂了,所以在我尝试这种混乱的方法之前,我会很感激你的替代建议。

附录:

第四种方法:

我目前正在使用两个子模板,并使用动态路径,根据给定条件在它们之间切换:

似乎有效:-)

你真的无能为力。大多数时候,ARM 模板都非常愚蠢。 if() 的两边都被评估并且必须存在。

此外,您不能使用 dependsOn 的表达式(另一个极其愚蠢的限制)。

至于你的问题,你必须将 certificatePfxBase64 传递给嵌套模板(即使它是空的),如果它是空的则不会创建证书。所以使用 json('null') 而不是 ''.