【问题标题】:'resource' function evaluates either way and fails“资源”函数评估任一方式并失败
【发布时间】:2018-03-22 00:53:34
【问题描述】:

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

  • 接受多个参数,包括:

    • hostBindingName
    • certificatePfxBase64

然后,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


    【解决方案1】:

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

    另外,你不能有dependsOn 的表达式(另一个非常愚蠢的限制)。

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

    【讨论】:

    • 谢谢。好主意。我最终在所有站点上安装了证书。 (证明它在 ST/UAT 中工作)并且只在 PROD 中进行主机名绑定(不会生成输出)。是的......他们确实“大多数时候都非常愚蠢”;-) 我从来没有找到有条件地创建新资源 (storageAccount) 的方法,然后有条件地引用它以仅在创建时将密钥添加到 keyvault。驱动我 batso。
    猜你喜欢
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2016-06-12
    • 2020-04-21
    相关资源
    最近更新 更多