'resource' 函数以任何一种方式计算并失败
'resource' function evaluates either way and fails
我有一个父 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 可以提供证书模板,则不会运行...
- 但是如果有主机名,主机名绑定可以继续进行——如果没有安装证书,则无法提供指纹等证书参数。
第一次尝试:条件证书 + 动态依赖 属性 主机名绑定。
第一种方法是在证书资源引用的父级 app.assembly.json
中放置一个 conditional
,这样如果 pfxBlob64
为空,则不会调用链接的模板。
由于模板现在是可选的,所以开始使 hostnameBinding
s 资源的 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() 方法。
这感觉太复杂了,所以在我尝试这种混乱的方法之前,我会很感激你的替代建议。
附录:
第四种方法:
我目前正在使用两个子模板,并使用动态路径,根据给定条件在它们之间切换:
web.certificate.json
调用资源,但这很好,因为提供了 pfxBase64。
web.certificate.null.json
,也就是 returns ""
似乎有效:-)
你真的无能为力。大多数时候,ARM 模板都非常愚蠢。 if()
的两边都被评估并且必须存在。
此外,您不能使用 dependsOn
的表达式(另一个极其愚蠢的限制)。
至于你的问题,你必须将 certificatePfxBase64
传递给嵌套模板(即使它是空的),如果它是空的则不会创建证书。所以使用 json('null')
而不是 ''
.
我有一个父 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 可以提供证书模板,则不会运行...
- 但是如果有主机名,主机名绑定可以继续进行——如果没有安装证书,则无法提供指纹等证书参数。
第一次尝试:条件证书 + 动态依赖 属性 主机名绑定。
第一种方法是在证书资源引用的父级 app.assembly.json
中放置一个 conditional
,这样如果 pfxBlob64
为空,则不会调用链接的模板。
由于模板现在是可选的,所以开始使 hostnameBinding
s 资源的 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() 方法。 这感觉太复杂了,所以在我尝试这种混乱的方法之前,我会很感激你的替代建议。
附录:
第四种方法:
我目前正在使用两个子模板,并使用动态路径,根据给定条件在它们之间切换:
web.certificate.json
调用资源,但这很好,因为提供了 pfxBase64。web.certificate.null.json
,也就是 returns ""
似乎有效:-)
你真的无能为力。大多数时候,ARM 模板都非常愚蠢。 if()
的两边都被评估并且必须存在。
此外,您不能使用 dependsOn
的表达式(另一个极其愚蠢的限制)。
至于你的问题,你必须将 certificatePfxBase64
传递给嵌套模板(即使它是空的),如果它是空的则不会创建证书。所以使用 json('null')
而不是 ''
.