Move VMs from an old SAN to an new using powerCLI part 2
Hi
I was informed that my script in the last post was not enough because @pfuhli has a bit more complex environment and then the Move-VM cmdlet is not sufficient because it moves the whole vm to the new datastore, no matter if the vmdk´s where located on different before.
As in some cases you have an virtual platform with different datastores for different performance levels and one VM has it´s vmdk configured to get the best throughput. So i did this with help from a script that Luc Dekens did in a communities post, mine added some functionality as his only moved the config file.
please comment if you find something crazy, I have now started to get the hang of why I would use functions :-), yes i should add some error-checking, that will be in version 0.3
Probably it would take some time to get through 500 VM´s but instead of manual work it is worth it.
# Move VMs with sVMotion where vmdk is on different datastores and # lastly move the config file to the same datastore as hard disk 1 # # Niklas Åkerlund / RTS 20111127 # Part of code from Luc Dekens http://communities.vmware.com/message/1680735 # Here i extended Luc´s function for moving only config function Move-VMs{ param($vm) Write-Host $vm $HDDs = Get-HardDisk -VM $vm # a foreach loop to move vmdk $HDDs | %{ # Get the datastore name of the old $oldDS = $_.Filename.Split(']')[0].TrimStart('[') # as @pfuhli said the new lun has a preceding letter that differs from the old. $newDS = "N" + $oldDS # Here i check which is the first hdd to later move the config there if ($_.Name -eq "Hard disk 1"){ $dsNameHDD1 = $newDS } $newDS = Get-Datastore $newDS Set-HardDisk -HardDisk $_ -Datastore $newDS -Confirm:$false } # This part is for moving the config file $HDDs = Get-HardDisk -VM $vm $spec = New-Object VMware.Vim.VirtualMachineRelocateSpec $spec.datastore = (Get-Datastore -Name $dsNameHDD1).Extensiondata.MoRef $HDDs | %{ $disk = New-Object VMware.Vim.VirtualMachineRelocateSpecDiskLocator $disk.diskId = $_.Extensiondata.Key $disk.datastore = $_.Extensiondata.Backing.Datastore $spec.disk += $disk } $vm.Extensiondata.RelocateVM_Task($spec, "defaultPriority") } Get-VM | %{ Move-VMs $_ }
Before running it on all VM´s i would test it on a few and then when feeling comfortable, you can move all 😀
Comments
This seems to be exactly what I need, however it seems to be a script that is added onto another script, yes?
I have the need to migrate multiple VMs in a specific folder to new datastores. The VMs currently live on 3 datastores with the Cdrive/config files on datastore1, temp/page file on datastore2 and data files on datastore3.
@Ben Liebowitz Its a function that I call with the Move-VMs $_ so no other script, you will have to edit with the newds to fit your environment
How do you use/execute this script? Could you provide an example possibly?
Niklas Can we convert this script to read form csv and loop ?
VM NAME
DATASTORE1
DATASTORE2
The Datastore Names for the Customer has no consistent naming convention.
yes that should not be a problem.. as long as there is some consistency with the datastores and vm´s