Azure ARM模板部署:添加附加数据磁盘独立现有

Azure ARM模板部署:添加附加数据磁盘独立现有,azure,arm-template,Azure,Arm Template,看起来我遇到了ARM模板的局限性,希望有人能为解决这一问题提供建议 我的deployVM.json模板使用copy函数来创建托管数据盘,它可以正常工作,但是,我需要附加一个不遵循复制模式的附加数据盘 属性。存储配置文件: "copy": [ { "name": "dataDisks", "count": "[length(parameters('sharedVariables').disks.config)]",

看起来我遇到了ARM模板的局限性,希望有人能为解决这一问题提供建议

我的deployVM.json模板使用copy函数来创建托管数据盘,它可以正常工作,但是,我需要附加一个不遵循复制模式的附加数据盘

属性。存储配置文件:

  "copy": [
            {
              "name": "dataDisks",
              "count": "[length(parameters('sharedVariables').disks.config)]",
              "input": {
                "name": "[concat(variables('vmName'),'-',parameters('sharedVariables').disks.config[CopyIndex('dataDisks')].name)]",
                "diskSizeGB": "[parameters('sharedVariables').disks.config[CopyIndex('dataDisks')].diskSizeGB]",
                "lun": "[parameters('sharedVariables').disks.config[copyIndex('dataDisks')].lun]",
                "createOption": "Empty",
                "managedDisk": {
                  "storageAccountType": "[parameters('sharedVariables').disks.accountType]"
                }
              }
            }
          ]
  • 不允许创建
    datadisks[]
    属性的第二个实例

  • 创建整个VM资源的第二个实例也不是一件容易的事 允许,

因此,我创建了一个子模板来绕过上述限制。子模板创建datadisk并将其连接到vm,但在执行连接时,它会取消连接deployVM.json中连接的磁盘:

"resources" : [
    //Create a managed disk using an existing VHD
    {
      "apiVersion": "2017-03-30",
      "type": "Microsoft.Compute/disks",
      "name": "[concat(parameters('vmName'),'-mediadisk-001')]",
      "location": "[resourceGroup().location]",
      "tags": {
        "Purpose": "Managed disk containing VHD of installation media",
        "createdBy": "[parameters('sharedVariables').createdBy]"
      },
      "sku": {
        "name": "[parameters('sharedVariables').media.storageAccountType]"
      },
      "properties": {
        "creationData": {
          "createOption": "Import",
          "sourceUri": "[parameters('sharedVariables').media.sourceVhdUri]"
        },
        "diskSizeGB": "[parameters('sharedVariables').media.vhdManagedDiskSize]"
      }
    },
    //Attach managed disk to existing VM
    {
      "apiVersion": "2017-03-30",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[parameters('vmName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [ "[concat(parameters('vmName'),'-mediadisk-001')]" ],
      "properties": {
        "storageProfile": {
          "dataDisks": [
            {
              "lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
              "name": "[concat(parameters('vmName'),'-mediadisk-001')]",
              "createOption": "Attach",
              "managedDisk": {
                "id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
              }
            }
          ]
        }
      }
    }
]
也许我应该在不创建托管数据磁盘的情况下尝试连接。毕竟,它是一个VHD,因此在子模板中,上面的内容被替换为:

"resources" : [
    {
      "apiVersion": "2017-03-30",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[parameters('vmName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [],
      "properties": {
        "storageProfile": {
          "dataDisks": [
            {
              "lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
              "name": "[concat(parameters('vmName'),'-mediadisk-001')]",
              "createOption": "FromImage",
              "image": {
                "uri": "concat(parameters('vmName'),'-mediadisk-001')"
              },
              "vhd": {
                "uri": "[parameters('sharedVariables').media.sourceVhdUri]"
              },
              "managedDisk": {
                  "id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
              }
            }
          ]
        }
      }
    }
]
然后,它继续抱怨
“不支持将基于blob的磁盘添加到具有托管磁盘的VM中。
。真的,这是说不能同时使用托管磁盘和存储帐户磁盘吗?最后一次尝试,我删除了以下行:

"managedDisk": {
              "id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
          }
但同样的错误

我可以在门户中重新连接磁盘,我唯一的其他想法是在子模板中创建另一个
copy[]
函数以重新连接,而无需返回存储帐户磁盘。这听起来很疯狂,所以我假设这是一个功能请求,或者我需要学习

短暂性脑缺血发作

更新
我已经从deployVM.json模板中删除了datadisks资源,并添加了两个子模板,每个“类型”的数据磁盘对应一个子模板当第二个子系统连接其磁盘时,从第一个子系统连接磁盘。

因此,它将分离现有磁盘,因为它使用声明性方法。您的第二次部署仅定义了1个数据磁盘,因此它将为您提供所需的。vm上有1个磁盘

您没有太多的选项来克服这一问题。请使用外部工具(如powershell)为您创建json并直接传入,或者使用arm模板创建包含所有磁盘的json对象并将其传入资源

      [
        {
          "lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
          "name": "[concat(parameters('vmName'),'-mediadisk-001')]",
          "createOption": "Attach",
          "managedDisk": {
            "id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
          }
        },
        {
          "lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
          "name": "[concat(parameters('vmName'),'-mediadisk-001')]",
          "createOption": "Attach",
          "managedDisk": {
            "id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
          }
        }
      ]
示例powershell对象以反映:

@(@{lun=xxx;...},@{...})

您不能将托管磁盘和非托管磁盘放在同一个虚拟机上。谢谢@4c74356b41。因此,我必须选择将VHD包装在托管磁盘中的第一个选项。那么,为什么部署会分离现有磁盘呢?必须支持它,因为我可以将它们添加回GUI。只是找不到a)它们首先分离的原因和b)如何重新连接。Thanks再次@4c74356b41,关于你的第二点,有没有可能举个例子。我假设我必须“写出”整个数据盘:[]属性,转换为JSON并将其作为参数传递到模板中。我可以这样做,但我不确定下一步要做什么。是否有一种特定的资源类型我应该用于JSON参数对象?我知道-使用powershell使用完整的磁盘配置创建整个子模板,并在Microsoft.resource/deployments中调用它,使用“properties.template”。根据你对我上一个问题的回答。仅供参考:是的,基本上您需要传入描述磁盘对象的相同json。编辑答案以反映示例对象