12

希望得到一些指导和解释dependsOn

我在模板中看到有两种方法可以在模板中提供依赖项。

一种方法是提供resourceId,另一种方法是使用concat. 我试图了解两者之间的区别。

例子

[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]

并且在一些示例中,这被引用为resourceId

[resourceId('Microsoft.Compute/virtualMachines', parameters('virtualMachineName'))]

我希望了解差异以及我们应该在哪些场景concat中引用依赖项以及我们可以在哪里使用resourceID

4

3 回答 3

12

是否使用 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?

于 2017-03-14T11:43:39.680 回答
8

至少可以说,该线程中的另一个答案具有误导性。

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

"dependsOn" [
    "/subscription/GUID/resourceGroups/rgName/provider/providerName/resource/resourceName"
]

显然,这是一个坏主意,但它说明了这一点。您只需要返回一个有效的资源标识符,您可以以任何方式构造它(或者您可以在使用脚本进行配置时将其作为变量传递)。

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

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

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

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

ps:可以正常工作的“损坏”resourceId示例:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2017-05-10",
            "name": "nestedTemplate",
            "resourceGroup": "xxx",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                        {
                            "type": "Microsoft.Storage/storageAccounts",
                            "apiVersion": "2017-06-01",
                            "name": "egw4y35hthrh35h24tz1",
                            "location": "eastus",
                            "sku": {
                                "name": "Standard_LRS"
                            },
                            "tags": {
                                "test": "[resourceId('Microsoft.Storage/storageAccounts', 'test')]"
                            },
                            "kind": "Storage",
                            "properties": {}
                        }
                    ]
                }
            }
        }
    ]
}

这必须是订阅级别的部署

于 2017-03-09T07:28:55.910 回答
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模板中的更多功能请参考文档

于 2017-03-09T02:19:22.753 回答