注意:这是一个Azure ARM问题,而不是一个Azure服务管理问题。

我的存储帐户中有2个vhds-machine-os.vhd和machine-data.vhd。我可以使用PowerShell ARM cmdlet创建具有现有OS vhd的VM,但无法弄清楚如何附加现有数据vhd。我发现的所有示例都创建了EMPTY数据磁盘-但我想将现有的vhd附加为数据磁盘。

我尝试将createOption attach开关与Add-AzureVMDataDisk一起使用,如下所示:
$vm = New-AzureVMConfig ...$vm = Add-AzureVMDataDisk -VM $vm -VhdUri $existingDiskUri -Name "machine-data.vhd" -Caching ReadOnly -CreateOption attach -DiskSizeInGB 200
但是,该操作失败并显示:
Blob https://x.blob.core.windows.net/vhds/machine-data.vhd already exists. Please provide a different blob URI to create a new blank data disk 'machine-data.vhd.'
我必须指定DiskSizeInGB才能使Add-AzureVMDataDisk命令起作用(这似乎很奇怪)。我尝试指定SourceImageUriVhdUri的其他名称,根据documentation,应将vhd从sourceImageUri复制到vhdUri并附加它。尝试createOption fromImage失败,因为“您无法使用源图像uri指定大小”。但是,该cmdlet的size参数是强制性的,因此我不知道如何指定sourceUri而不是size。

This SO question出现了类似的问题(尽管我没有得到相同的错误),但是答案中的链接显示了带有EMPTY数据磁盘的模板,这没有帮助。

有趣的是,我尝试将磁盘从Azure门户添加到VM-您必须在其中指定名称和URI,但是操作总是失败,并出现一些奇怪的json解析错误。我似乎无法正确获取数据磁盘的uri。

最佳答案

经过多玩之后,我发现了一个hack:

  • 为现有磁盘提供新的URI,并将其设置为vhdUri
  • 使用现有磁盘的URI作为sourceImageUri
  • 使用Add-AzureVMDataDisk调用CreateOption fromImage
  • 将数据磁盘的大小设置为null(这是hack)
  • 调用New-AzureVM时,现有磁盘将复制到新的Uri
  • 创建虚拟机后,我删除了原始的vhd

  • 不幸的是,由于它是强制性的,因此必须向DiskSizeInGB命令提供Add-AzureVMDataDisk参数。但是,我将其设置为null,否则设置将失败(错误消息表明您不能同时指定size和sourceImageUri)。

    这是最终代码:
    $vm = New-AzureVMConfig ...
    $vm = Add-AzureVMDataDisk -VM $vm `
          -SourceImageUri $existingDataDiskUrl -VhdUri $newDataDiskUri `
          -Name $newDataDiskName -CreateOption fromImage -Caching ReadOnly `
          -DiskSizeInGB 200
    
    # hack
    $vm.StorageProfile.DataDisks[0].DiskSizeGB = $null
    

    之后,您可以致电:
    New-AzureVM -ResourceGroupName $ rgName-位置$ location -VM $ vm

    创建虚拟机后,我调用Remove-AzureStorageBlob删除原始磁盘。

    也许有一种更清洁的方法,但是我找不到。至少这种方式最终有效。

    关于powershell - 使用PowerShell Azure资源管理器cmdlet将现有的vhd添加到Azure VM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31452664/

    10-13 04:19