Azure ARM模板(DependsOn)

Azure ARM模板(DependsOn),azure,arm-template,azure-template,Azure,Arm Template,Azure Template,希望获得有关dependsOn的指导和解释 我在模板中看到,有两种方法可以在模板中提供依赖项 一种方法是提供resourceId,另一种方法是使用concat提供字符串值。我试图理解两者之间的区别 范例 [concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))] 在一些示例中,这是通过resourceId引用的: [resourceId('Microsoft.Compute/virtua

希望获得有关
dependsOn
的指导和解释

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

一种方法是提供
resourceId
,另一种方法是使用
concat
提供字符串值。我试图理解两者之间的区别

范例

[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]
在一些示例中,这是通过
resourceId
引用的:

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

我希望了解差异,以及在哪些场景中我们应该使用
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模板中的更多函数请参考。

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

无论您采用哪种路径来实际向模板的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": {}
                        }
                    ]
                }
            }
        }
    ]
}

这必须是订阅级别的部署

当您使用或不使用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不需要resourceId,因为您只能依赖同一模板中的资源。在我的示例中,需要的是publicIPAddress id。此属性需要一个完整的资源id,这是resourceId函数提供的。因此问题是,该属性是否需要完整的资源Id?

感谢您的发布。但我试图理解为什么在某些情况下,我们在dependances(Dependson)下使用Concat为什么我们在某些情况下使用ResourceID?这是我的困惑。我已经更新了答案。如果我们想要部署资源,那么我们需要提供ResourceID,虽然我们可以包含多个字符串,但我们可以通过使用ResourceID函数轻松获得它谢谢。这是否意味着如果我需要引用订阅之外的对象,我必须使用资源ID,如果它是我订阅中的一个资源,我可以使用ResourceID或Concat?从我可以看到Concat没有订阅ID/资源组信息等,这意味着我认为它也必须在同一个资源组中?Concat不用于引用资源,只需组合多个字符串值。如果e要部署资源,我们需要选择要部署的订阅。谢谢。使用嵌套模板,我得到错误“abc…不依赖父资源abc…”。。。请使用'dependsOn'语法显式添加依赖项…。虽然VM是在同一模板中创建的,但为了解决此问题,我尝试完全限定资源,但实际上必须减少限定条件。我需要做的只是将“[resourceId('Microsoft.Compute/virtualMachines/',variables('vmName'))]”替换为“[variables('vmName')]”('vmName']"。这不是真的,或者不完全是真的。如果您在同一个部署中有两个同名资源,那么这就行不通了。真的是这样吗?当尝试使用
resourceId
I get
引用模板外的任何资源时,如果不亲自尝试,则在模板中未定义资源“XXXXX”
,我不是ure,另外,我已经有几年没有使用arm模板了。没有看到你的模板和rg等,可能有多种原因。可能是名称错误,可能是它在不同的资源组中,所以你需要更多的限定符,等等……但我在撰写本文时向你保证,这绝对是正确的。resourceId文档解释得很清楚。如果resourceId()不能用于获取资源的resourceId,是否可以添加这样一个示例或链接到答案?这将清楚地区分两个函数的用例。