希望得到一些关于DependsOn的指导和解释。我在模板中看到有两种方法可以在模板中提供依赖关系。 一种方法是提供ResourceID,另一种方法是使用Concat提供字符串值。我想了解两者之间的区别。
实施例 “[concat('Microsoft.Network/networkInterfaces/',variables('networkInterfaceName'))]”,
并且在一些示例中,这是使用ReferenceID的引用 “[resourceId('Microsoft.Compute / virtualMachines',parameters('virtualMachineName'))]”,
我希望了解差异以及在哪些场景中我们使用Concat来引用依赖项以及我们可以在哪里使用ResourceID
答案 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。