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,是否可以添加这样一个示例或链接到答案?这将清楚地区分两个函数的用例。