[英]Azure ARM Templates (DependsOn)
希望獲得一些有關dependsOn
指導和解釋。
我在模板中看到有兩種方法可以在模板中提供依賴項。
一種方法是提供resourceId
,另一種方法是使用concat
提供字符串值。 我試圖了解兩者之間的區別。
例子
[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]
還有一些例子,這是用resourceId
引用的:
[resourceId('Microsoft.Compute/virtualMachines', parameters('virtualMachineName'))]
我希望了解差異,以及在哪些情況下我們應該使用concat
來引用依賴項以及我們可以在哪里使用resourceID
。
何時使用 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?
至少可以說,該線程中的另一個答案具有誤導性。
您實際采用哪條路線為模板的dependsOn(或任何其他屬性)提供值並不重要。 地獄,你可以在那里放一根繩子
"dependsOn" [
"/subscription/GUID/resourceGroups/rgName/provider/providerName/resource/resourceName"
]
顯然,這是一個壞主意,但它說明了這一點。 您只需要返回一個 VALID 資源標識符,您可以以任何方式構造它(或者您可以在使用腳本進行配置時將其作為變量傳入)。
此外,有時當您使用嵌套資源時,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": {}
}
]
}
}
}
]
}
這必須是訂閱級別的部署
區別:
concat :組合多個字符串值並返回連接的字符串。
resourceId :返回資源的唯一標識符。
示例“[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]”
結果: Microsoft.Network/networkInterfaces/{networkInterfaceName}
networkInterfaceName Microsoft.Network/networkInterfaces/{networkInterfaceName}
示例:[resourceId('Microsoft.Compute/virtualMachines', parameters('virtualMachineName'))]",
結果:/ /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/{Microsoft.Compute/virtualMachines}/{networkInterfaceName}/
更多ARM模板中的功能請參考文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.