代码之家  ›  专栏  ›  技术社区  ›  Kasun Kodagoda

if()函数如何在Azure资源管理器模板中执行

  •  3
  • Kasun Kodagoda  · 技术社区  · 6 年前

    我正在使用 if() 我的ARM模板中的函数,用于在我的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'))]"
    

    为了简化它,条件如下:;

    [如果(等于(arg1,arg2),true\u表达式,false\u表达式]

    当我使用部署ARM模板时 isProduction 参数设置为 No 执行引发异常。什么时候 i生产 参数设置为 Yes 然后模板就可以正常工作了。例外情况与ARM试图查找不在中部署的redis缓存资源有关 非生产性 环境

    我猜即使 i生产 参数值为 这个 true\u表达式 在上述引用Redis缓存资源的条件下,将执行 未在非生产状态下创建Redis缓存资源 ,它抛出异常。

    所以我的问题是,当我们有上述情况时 true\u表达式 以及 false\u表达式 如果() 函数在 如果() 是否执行功能?

    如果是这样的话,有什么可能的解决方法来解决这个问题?

    2 回复  |  直到 6 年前
        1
  •  2
  •   4c74356b41    6 年前

    两侧 if() 无论如何计算(在ARM模板中)。所以你必须用“聪明”的方法来解决这个问题。

    您可以使用嵌套部署\变量来尝试解决此问题。

    更新:这在一段时间前已经被修复,只有 如果() 对函数进行评估。

        2
  •  0
  •   rickvdbosch    6 年前

    我的猜测是: 不,只有 是的,两种表达 根据if声明的结果需要 进行评估。

    要解决您的问题,可以使用特定于环境的参数文件。这使您能够仅包括要部署到的环境的参数。

    请参见 documentation on parameters 在“了解Azure资源管理器模板的结构和语法”一文中。

    在模板的参数部分中,指定部署资源时可以输入的值。这些参数值使您能够通过提供针对特定环境(如开发、测试和生产)定制的值来定制部署。您不必在模板中提供参数,但如果没有参数,模板将始终使用相同的名称、位置和属性部署相同的资源。