Azure ARM模板(DependsOn)

时间:2017-03-09 01:47:06

标签: azure arm-template azure-template

希望得到一些关于DependsOn的指导和解释。我在模板中看到有两种方法可以在模板中提供依赖关系。 一种方法是提供ResourceID,另一种方法是使用Concat提供字符串值。我想了解两者之间的区别。

实施例 “[concat('Microsoft.Network/networkInterfaces/',variables('networkInterfaceName'))]”,

并且在一些示例中,这是使用ReferenceID的引用 “[resourceId('Microsoft.Compute / virtualMachines',parameters('virtualMachineName'))]”,

我希望了解差异以及在哪些场景中我们使用Concat来引用依赖项以及我们可以在哪里使用ResourceID

3 个答案:

答案 0 :(得分:4)

至少可以说,这个帖子中的另一个答案是误导性的。

将实际提供给模板的dependsOn(或任何其他属性)的值用于哪条路径并不重要。见鬼,你可以在那里放一根绳子

"dependsOn" [
    "/subscription/GUID/resourceGroups/rgName/provider/providerName/resource/resourceName"
]
显然,这是一个坏主意,但它说明了这一点。您只需要返回一个VALID资源标识符,您可以以任何方式构造它(或者您可以在配置脚本时将其作为变量传递。

此外,有时在使用嵌套资源时resourceId无法工作,因此您需要连接3个变量,在这种情况下,concat可以提供帮助。

没有什么能阻止你将一个嵌套在另一个里面:

"[concat(resourceId('Microsoft.Compute/virtualMachines', parameters('virtualMachineName'), 'SOME TEXT'))]

TLDR您可以使用任何您喜欢的方式返回有效的资源标识符。

答案 1 :(得分:4)

何时使用resourceId(在dependsOn中)之间的真正区别在于:您依赖的资源是否在同一模板中?如果是这样,你可以简单地拥有这个名字。例如,这是一个负载均衡器,它依赖于在同一模板中创建的公共IP和vNet:

  "apiVersion": "[variables('lbApiVersion')]",
  "type": "Microsoft.Network/loadBalancers",
  "name": "[variables('lbName1')]",
  "location": "[variables('computeLocation')]",
  "dependsOn": [
    "[variables('lbIPName1')]",
    "[variables('virtualNetworkName')]"
  ],
  "properties": {
    "frontendIPConfigurations": [
      {
        "name": "LoadBalancerIPConfig",
        "properties": {
          "publicIPAddress": {
            "id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('lbIPName1'))]"
          }

如果要从模板外部引用资源,则需要resourceId。 dependsOn不需要这样做,因为您只能依赖于同一模板中的资源。在我的示例中需要的地方是publicIPAddress id。此属性需要完整资源Id,这是resourceId函数提供的内容。所以问题就变成了,该属性是否需要完整的资源ID?

答案 2 :(得分:1)

<强>差:

concat:组合多个字符串值并返回连接的字符串。

resourceId:返回资源的唯一标识符。

  

示例“[concat('Microsoft.Network/networkInterfaces/',variables('networkInterfaceName'))]”

结果:Microsoft.Network/networkInterfaces/{networkInterfaceName}

  

示例:[resourceId('Microsoft.Compute / virtualMachines',parameters('virtualMachineName'))]“,

结果:/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/{Microsoft.Compute/virtualMachines}/{networkInterfaceName}/

ARM模板中的更多功能请参考document