我在ARM模板中使用if()
函数来有条件地在我的Web App资源中设置一些连接字符串值。目前的情况看起来像这样。
"[if(equals(parameters('isProduction'), 'Yes'), concat(variables('redisCacheName'),'.redis.cache.windows.net:6380|', listKeys(resourceId('Microsoft.Cache/Redis', variables('redisCacheName')), '2015-08-01').primaryKey, '|', variables('resourcePrefix')), parameters('redisSessionStateConnection'))]"
为了简化它,条件看起来像这样;
[if(equals(arg1,arg2),true_expression,false_expression)]
当我将isProduction
参数设置为No
的ARM模板部署时,执行会抛出异常。当isProduction
参数设置为Yes
时,模板工作正常。例外情况与ARM尝试查找将不会部署在非生产环境中的redis缓存资源有关。
我的猜测是,即使isProduction
参数值为No
,上述条件中的 true_expression 也会执行Redis缓存资源,因为< em> Redis缓存资源不是在非生产状态下创建的,它会抛出异常。
所以我的问题是,当我们遇到上述情况时,if()
函数中的 true_expression 和 false_expression 是否会在实际条件之前进行评估执行if()
函数?
如果是这样,可以解决这个问题的解决方法是什么?
答案 0 :(得分:2)
无论(在ARM模板中)是否评估if()
的双方。所以你必须使用&#34;聪明的&#34;方式。
您可以使用嵌套部署\变量来尝试解决此问题。
更新:这已经修复了一段时间,只评估了if()
函数的相关部分。
答案 1 :(得分:0)
我的猜测是:不,只有是,根据if语句的结果所需的两个表达式都会被评估。
要解决您的问题:您可以使用特定于环境的参数文件。这使您只能包含要部署到的环境的参数。
请参阅“了解Azure Resource Manager模板的结构和语法”一文中的documentation on parameters。
在模板的参数部分中,指定在部署资源时可以输入的值。通过这些参数值,您可以通过提供为特定环境(例如开发,测试和生产)定制的值来自定义部署。您不必在模板中提供参数,但如果没有参数,您的模板将始终使用相同的名称,位置和属性部署相同的资源。