【问题标题】:Attach managed data disks to a vm将托管数据磁盘附加到 vm
【发布时间】:2020-04-29 08:59:03
【问题描述】:

我正在尝试开发一个脚本来将数据磁盘从快照创建附加到另一个 Azure VM

  1. 从源 VM 创建现有数据磁盘的 SNAPSHOTS
  2. 从步骤 1 中创建的 SNAPSHOTS 创建新的 DATADISKS
  3. 将新的 DATADISKS 附加到目标 VM

但是,我在尝试附加磁盘时不断出错(第 3 步)。

Get-AzDisk:找不到资源组“RG-Test”下的资源“Microsoft.Compute/disks/disk_name2”。 错误代码:资源未找到 错误消息:未找到资源组“RG-Test”下的资源“Microsoft.Compute/disks/disk_name2”。 错误目标: 状态码:404 原因短语:未找到 操作ID:67319e0f-3f8f-416a-bb25-9d0547e661a4 Au caractère Ligne:22 : 13 + $disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskNam ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~ + CategoryInfo : CloseError : (:) [Get-AzDisk], ComputeCloudException + FullyQualifiedErrorId:Microsoft.Azure.Commands.Compute.Automation.GetAzureRmDisk Add-AzVMDataDisk : Impossible de valider l'argument sur le paramètre « ManagedDiskId »。 L'argument est Null ou vide。 Indiquez un argument qui n'est pas Null ou vide et réessayez。 Au caractère Ligne:24 : 110 + ...nation_vm_object -CreateOption 附加 -ManagedDiskId $disk.Id -Lun $l ... + ~~~~~~~~ + CategoryInfo : InvalidData : (:) [Add-AzVMDataDisk],ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Azure.Commands.Compute.AddAzureVMDataDiskCommand

代码:


## Create Snapshot from a Managed Disk ##
$resourceGroupName = 'RG-Test' 
$location = 'east us 2' 
$source_vm_name = 'VMS'
$destination_vm_name = 'VMD'

$data_disk_list = Get-azDisk | where {$_.ManagedBy -match $source_vm_name -and $_.OsType -eq $null}

$snapshot_list = New-Object System.Collections.ArrayList($null)

foreach($data_disk_list_iterator in $data_disk_list){

    $snapshotName = $destination_vm_name + "_Snapshot_" + $data_disk_list_iterator.Name

    $snapshot_config = New-AzSnapshotConfig -SourceUri $data_disk_list_iterator.id -Location $location -CreateOption copy

    $snapshot_object = New-AzSnapshot -Snapshot $snapshot_config -SnapshotName $snapshotName -ResourceGroupName $resourceGroupName

    $snapshot_list.Add($snapshot_object.Id)

}

## Create Managed Data Disk from snapshot created above ##

$i=0

$destination_datadisk_list = New-Object System.Collections.ArrayList($null)

$destination_vm_object = Get-AzVM -Name $destination_vm_name -ResourceGroupName $resourceGroupName 


$lun_count = 1


foreach($snapshot_list_iterator in $snapshot_list){


    $disk_name = $destination_vm_name + "_datadisk_" + $i

    $i += 1

    $diskConfig = New-AzDiskConfig -AccountType $storageType -Location $location -CreateOption Copy -SourceResourceId $snapshot_list_iterator

    $datadisk_object = New-AzDisk -Disk $diskConfig -ResourceGroupName $resourceGroupName -DiskName $disk_name

    $disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskName disk_name$i

    $destination_vm_object = Add-AzVMDataDisk -VM $destination_vm_object -CreateOption Attach -ManagedDiskId $disk.Id -Lun $lun_count

    $lun_count += 1

    Update-AzVM -VM $destination_vm_object -ResourceGroupName $resourceGroupName

}

有人可以帮我解决这个错误吗?

【问题讨论】:

  • 第一次阅读时,错误在这里$disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskName disk_name$i。将其更改为 $disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskName $disk_name
  • 感谢@Theo 的回复,今晚我将测试修改。另一件事请这个变量是什么:$ data_disk_list_iterator
  • $data_disk_list_iterator 是一个变量,每次运行循环时都包含集合 $data_disk_list 中的一项。 (通常人们称之为$i)。在循环中,这个变量代表一个Managed disk 对象。
  • 感谢@Theo 的解释,这真的很有趣
  • @azure-power 你可以吗?如果可以,请您发表您的答案吗?

标签: azure powershell azure-virtual-machine azure-powershell azure-managed-disk


【解决方案1】:

正如评论,错误信息表明你刚刚在这里的代码中打错了:

$disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskName disk_name$i

在第二个循环中,您通过在末尾连接循环计数器$i 来定义变量$disk_name。那个代码很好。

但是,在循环内,您尝试再次将此循环计数器添加到名称中,但同时使用 disk_name 而前面没有 $ 符号。如果没有美元符号,则将名称视为文字字符串。

要使其正常工作,您只需将上述代码行更改为:

$disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskName $disk_name

【讨论】:

  • 感谢您的帮助。它可以工作,我可以附加托管数据磁盘其他问题是什么可以更改集成功能的代码谢谢
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多