我正在尝试创建一个条件资源模板。开发环境不如生产环境强大,而且我在很大程度上成功地做到了这一点。但是,我似乎无法正确获取嵌套资源。
这是我的 ARM 模板中的一个片段:
"webApp-resources": "[variables(concat('webApp-', parameters('env'), '-resources'))]",
"webApp-dev-resources": [],
"webApp-prod-resources": [
{
"name": "staging",
"type": "Microsoft.Web/sites/slots",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"dependsOn": [
"[resourceId('Microsoft.Web/sites', variables('webApp-name'))]"
]
}
],
这个想法很简单,资源变量是使用env
参数组成的。env
参数可以是dev
或,虽然这prod
有效,但当我尝试部署此模板时出现以下错误。
{
"name": "[variables('webApp-name')]",
"type": "Microsoft.Web/sites",
...
"resources": "[variables('webApp-resources')]" // <- culprit!
},
请求内容无效,无法反序列化:“将值“[variables('webApp-resources')]”转换为类型“Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Schema.TemplateResource[]”时出错。路径“properties.template.resources[1].resources”,第 195 行,位置 64。
我还尝试将资源移动到一个变量中并以类似的条件方式引用该变量,这与我们如何进行嵌套模板链接但没有模板链接非常相似。
resources: [
"[variables('webApp-resource')]" // <- this doesn't work!
]
如果我没记错的话,这会导致类似的错误,但会出现不同的错误。
由此我得出结论,ARM 模板语法不是简单的查找和替换,我认为这是不好的,因为它确实让我们更难推理什么有效,什么无效。因为如果是这样,这将产生一个有效的模板。我通过将正确的值粘贴到资源部分来验证这一点。
有没有人遇到过类似的问题,你是如何解决这个问题的?