1
votes

I am trying to develop a script to attach data diskscreating from snapshots to another Azure VM

  1. Create SNAPSHOTS of existing data disks from source VM
  2. Create new DATADISKS from the SNAPSHOTS created from step 1
  3. Attach the new DATADISKS to the destination VM

however I keep getting error when trying to attach the disks(step 3).

Get-AzDisk : The Resource 'Microsoft.Compute/disks/disk_name2' under resource group 'RG-Test' was not found.
ErrorCode: ResourceNotFound
ErrorMessage: The Resource 'Microsoft.Compute/disks/disk_name2' under resource group 'RG-Test' was not found.
ErrorTarget: 
StatusCode: 404
ReasonPhrase: Not Found
OperationID : 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 Attach -ManagedDiskId $disk.Id -Lun $l ...
+                                                          ~~~~~~~~
    + CategoryInfo          : InvalidData : (:) [Add-AzVMDataDisk], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Azure.Commands.Compute.AddAzureVMDataDiskCommand

The code :


## 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

}

Could someone help me resolve this error?

1
On first read, Ithe error is here $disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskName disk_name$i. Change that to $disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskName $disk_nameTheo
thanks @Theo for your reply, i will be testing the modification tonight. another thing please what is this variable: $ data_disk_list_iteratorazure-power
The $data_disk_list_iterator is a variable that contains one item from the collection $data_disk_list each time the loop is run. (Usually people just call this $i). Within the loop this variable represents one Managed disk object .Theo
thanks @Theo for the explanation it's really interestingazure-power
@azure-power Is that Ok for you? If it is ok, could you please post your answer?Jim Xu

1 Answers

1
votes

As commented, the error message shows that you have just made a typo in the code here:

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

Within that second loop, you are defining a variable $disk_name by concatenating the loopcounter $i at the end. That code is fine.

However, inside the loop you are trying to add this loopcounter to the name again but at the same time use disk_name without the $ sign in front. Without the dollar sign, the name is taken as literal string.

All you have to do to make it work is change the above mentiond line of code into:

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