将条件逻辑添加到 ARM 模板

已完成

在某些情况下,可能需要选择性地部署资源。 常见的情况是在 VM 上添加负载均衡器。 假设你有一个电子商务站点,并且想要确保该站点可以承受通过促销增加的流量。 负载均衡器是一种可与 VM 关联的资源类型。 通过有条件地添加规则,你可以启用或禁用要应用于相关 VM 的负载均衡器。

描绘以下情况:

  • 预先存在的资源组。 指定模板中的资源并对其进行部署时,将发生以下两种情况之一。 资源已部署,或资源未部署(如果已存在)。 检查资源是否存在是 Azure 资源管理器可为你执行的操作;该操作是隐式的。 问题在于,当你推断出如何检查某些资源是否预先存在时,是否可以充分利用此机制。
  • 分支逻辑。 根据在部署时传递给模板的参数,你可能想要部署一组不同的资源。 要表示的内容称为“分支逻辑”。 如果参数具有特定类型的值,则选择第一个分支。 否则,请选择要部署的第二个或第三个分支。 分支逻辑以这种方式继续。

以上两种情况都表示应用条件逻辑的情况。 逻辑是资源管理器系统本身,或者是需要显式表示的内容。

条件部署

使用 condition 构造可以表示是否需要部署某些资源。 这是附加到资源元素的属性,其值为 truefalse。 通常,你会在模板中查找类似于以下 JSON 的 condition 构造:

"resources" : [
  {
    "condition": "[parameters('shouldDeploy')]"
  }
]

在上述 JSON 中,向资源添加了一个 condition 属性。 属性的值的计算结果为参数 shouldDeploy 的值。

计算

可以通过两种方法来计算 condition 构造。 了解这两种方法可能会影响你选择表示 conditional 逻辑的方式。 两种不同的方法是:

  • 值为 true/false。 例如,请考虑以下构造:

    "condition": "[parameters('deployAccount')]"
    

    deployAccount 值是一个参数,可以在部署时传递该参数的值,也可以回退到默认值。 不管使用哪种方法,值都为严格的 false 或 true。 尝试分配另一个非布尔值将导致错误。

  • 表达式的计算结果为 true/false。 此处,你将使用内置模板函数 equals(arg1, arg2),而不是将严格的 true/false 值分配到 condition 构造。 arg1 需要等于 arg2,以便函数的计算结果为 true。 现在,condition 构造可以按如下所示表示:

    "condition": "[equals(parameters('newOrExisting'),'new')]"
    

    使用 equals() 函数时,传递给参数的值不再需要为 truefalse。 它需要与 equals() 函数中的第二个参数相匹配。 在上面的 JSON 示例中,newOrExisting 参数的值需要与字符串 new 匹配,才能使该函数的计算结果为 true