簡體   English   中英

Azure ARM 模板(取決於)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM