【问题标题】:Azure ARM Template dependsOn: Resource Not Defined in TemplateAzure ARM 模板取决于:模板中未定义资源
【发布时间】:2016-12-15 02:43:00
【问题描述】:

我想使用 Visual Studio 2015 在 azure 中为资源组创建一个新的虚拟机。 新的 vm 依赖于同一资源组中的现有资源,该资源未在模板中声明。但我得到“资源'Microsoft.Storage/storageAccounts/***'是 02:21:10 - 未在模板中定义”

"resources": [
{
  "apiVersion": "2015-06-15",
  "type": "Microsoft.Compute/virtualMachines",
  "name": "[variables('vmName')]",
  "location": "[resourceGroup().location]",
  "tags": {
    "displayName": "VirtualMachine"
  },
  "dependsOn": [
    "[resourceId('0abb7c58-93b4-45f4-b1be-61a98ac347a3','securitydata','Microsoft.Storage/storageAccounts', parameters('storageAccounts_simscitestrg6892_name'))]"
  ],

DependsOn 只能引用同一个 ARM 模板中的资源?

任何帮助表示赞赏。

问候,弗兰克。

【问题讨论】:

    标签: azure azure-resource-manager arm-template azure-template


    【解决方案1】:

    DependsOn 只能引用同一个 ARM 模板中的资源?

    从这个官方document关于在 Azure 资源管理器模板中定义依赖关系,我们可以发现如下:

    资源管理器评估资源之间的依赖关系,并按依赖顺序部署它们。当资源不相互依赖时,资源管理器会并行部署它们。 您只需为部署在同一模板中的资源定义依赖项

    根据我的测试,我可以重现此问题。您需要在模板中添加 Storage 资源,如下所示:

    {
        "name": "[parameters('storageAccounts_simscitestrg6892_name')]",
        "type": "Microsoft.Storage/storageAccounts",
        "location": "[resourceGroup().location]",
        "apiVersion": "2015-06-15",
        "dependsOn": [],
        "tags": {
          "displayName": "StorageAccountResourceName"
        },
        "properties": {
          "accountType": "[parameters('StorageAccountType')]"
        }
    }
    

    对于您的 VM 资源,您可以在“properties > storageProfile”部分下配置osDisk,如下所示:

    "osDisk": {
      "name": "Your-VMOSDisk",
      "vhd": {
        "uri": "[concat('https://', parameters('storageAccounts_simscitestrg6892_name'), '.blob.core.windows.net/', variables('Your-VMStorageAccountContainerName'), '/', variables('Your-VMOSDiskName'), '.vhd')]"
      },
      "caching": "ReadWrite",
      "createOption": "FromImage"
    }
    

    存储资源将创建在与您的 VM 相同的位置(如果不存在)。

    【讨论】:

    • 是的,我使用参考函数。 “输出”:{“storageAccountInfo”:{“值”:“[参考(concat('Microsoft.Storage/storageAccounts/',参数('storageAccountname')),提供者('Microsoft.Storage','storageAccounts')。 apiVersions[0])]", "type": "object" } }
    【解决方案2】:

    不,这没有意义,dependsOn 属性旨在跟踪 ARM 模板内部的依赖关系,因此它可以按特定顺序配置资源。如果有资源,那么跟踪它是没有意义的。它已经在那里了。使用时引用即可。

    【讨论】:

    • 是的,我使用参考函数。 “输出”:{“storageAccountInfo”:{“值”:“[参考(concat('Microsoft.Storage/storageAccounts/',参数('storageAccountname')),提供者('Microsoft.Storage','storageAccounts')。 apiVersions[0])]", "type": "object" } }
    • 至少在一种情况下这实际上是有意义的,因为似乎在 ARM 中部署最终是一致的。假设我部署了依赖于资源 A 的资源 B,两者都使用链接模板,键入 Microsoft.Resources/deployments。 AdependsOn从B设置为A。关键是当A的部署结束时,可能会出现B中的资源还没有看到A中的资源,导致B部署失败。环顾四周,很多人都在抱怨这个问题,我还没有找到解决方案。
    • 这正是我正在做的事情,我有一个例子表明它不起作用 - 我们可能会提出问题。
    • 嗯,这应该是不可能的。你有复刻吗?
    【解决方案3】:

    是的。当您创建依赖于您通过同一模板创建的另一个资源的资源时,将使用 DependsOn。如果资源已经创建,那么您只需添加对它的引用。在您的情况下,您可以像这样为 VM 添加属性键:

    "properties": {
                    "hardwareProfile": {
                        "vmSize": "Standard_DS1"
                    },
                    "storageProfile": {
                        "imageReference": {
                            "publisher": "MicrosoftWindowsServerHPCPack",
                            "offer": "WindowsServerHPCPack",
                            "sku": "2012R2",
                            "version": "latest"
                        },
                        "osDisk": {
                            "name": "[parameters('virtualMachines_APP01_name')]",
                            "createOption": "FromImage",
                            "vhd": {
                                "uri": "[concat('https', '://', parameters('storageAccounts_vmdkstorageacct_name'), '.blob.core.windows.net', concat('/vhds/', parameters('virtualMachines_APP01_name'),'APP01.vhd'))]"
                            },
                            "caching": "ReadWrite"
                        },
                        "dataDisks": []
                    },
                    "osProfile": {
                        "computerName": "[parameters('virtualMachines_APP01_name')]",
                        "adminUsername": "vmadmin",
                        "windowsConfiguration": {
                            "provisionVMAgent": true,
                            "enableAutomaticUpdates": true
                        },
                        "secrets": [],
                        "adminPassword": "[parameters('virtualMachines_APP01_adminPassword')]"
                    },
                    "networkProfile": {
                        "networkInterfaces": [
                            {
                                "id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_app01_name'))]"
                            }
                        ]
                    }
                }
    

    【讨论】:

    • 是的,我使用参考函数。 “输出”:{“storageAccountInfo”:{“值”:“[参考(concat('Microsoft.Storage/storageAccounts/',参数('storageAccountname')),提供者('Microsoft.Storage','storageAccounts')。 apiVersions[0])]", "type": "object" } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多