Скрипт PowerCLI по «миграции» хоста между двумя vCenter с включенными VM

Возникала задача «переключить» хосты из одного vCenter в другой с работающими на борту виртуальными машинами, так же активно использующие сеть. Задача достаточно нетривиальная, ее причину мы опустим и перейдем сразу к самому «соку».

Есть несколько условий для работы скрипта, в частности:

  1. На целевом хосте, который мы будем «двигать» должны быть как минимум два подключенных сетевых адаптера на одном виртуальном коммутаторе, потому как во время переезда хост будет добавляться в новый VDS (а скрипт написан именно для распределенного свича) и один из аплинков будет назначен ему.
  2. На целевом vCenter, куда мы «перетаскиваем» хост должен быть сконфигурирован распределенный виртуальный коммутатор, ВАЖНО! С такими же названиями порт групп.
  3. Следует учесть что во время исполнения скрипта машины будут переключаться со старой портгруппы старого коммутатора на новую портгруппу в новом коммутаторе целевого vCenter.
  4. Следует учесть избежания ситуации когда в целевом vCenter уже есть VM с такими же именами как VM на «переезжающем» хосте, иначе скрипт переключит сеть на них (на тех которые уже есть на vCenter), так как новоприбывшие машины будут при добавлении именоваться $vmname+(1). Опасный момент, на который я сам нарвался. Можно конечно переделать скрипт под это, но это уже другая история.
#подключаемся к старому vCenter
Connect-Viserver vcsa-name

#вводим имя хоста , который переедет
$ESXiname='esxi-name'  
$VMhost=Get-VMhost $ESXiname
$VMs=Get-VM | Where-Object -Property VMHost -eq $VMhost

##В CSV файл выгружаются параметры сетевых адаптеров vNIC машин на нашем хосте
foreach ($vm in $VMs)
{
 Get-NetworkAdapter -VM $vm | Select-Object -Property @{N="VMName";E={$vm.Name}}, Name, Type, NetworkName, MacAddress, ConnectionState | Export-Csv -Path 'C:\Temp\powercli\ports.csv' -Append -UseCulture -NoTypeInformation
}

##Хост отключается от вицентра
Set-VMHost -VMHost $VMhost -State Disconnected -Confirm:$false
##Отключаемся от вицентра мы сами
Disconnect-Viserver vcsa-name -Confirm:$false


##Подключаемся к целевому вицентру
Connect-VIServer vcsa-name1
##Добавляем наш хост в целевой вицентр
Add-VMHost -Name $ESXiname -Location "DATACENTERNAME" -User root -Password "pawwd" -Force
##Задаем имя целевому распределенному комутатору
$VDSName='VSD-Name'

##ВНИМАНИЕ! Устанавливаем какие физические интерфейсы являются аплинками
$uplink1=Get-VMHostNetworkAdapter -VMHost $ESXiname -Name "vmnic4"                              
$uplink2=Get-VMHostNetworkAdapter -VMHost $ESXiname -Name "vmnic5"                              

##Идет процесс добавления нового VDS к хосту 
$VDS=Get-VDSwitch -Name $VDSName
$vmkerneladapter=Get-VMHostNetworkAdapter -VMHost $ESXiname -Name "vmk0"
Add-VDSwitchVMHost -VDSwitch $VDSName -VMHost $ESXiname
$VDS | Add-VDSwitchPhysicalNetworkAdapter -VMHostPhysicalNic $uplink1 -VMHostVirtualNic $vmkerneladapter -VirtualNicPortgroup 'Vlan 3011' -Confirm:$false

##импорт настроек VM из CSV
$Network=Import-Csv -Path C:\Temp\powercli\ports.csv -UseCulture 

##Переключение vNIC виртуальных машин в новые портгруппы.
foreach($v in $Network)
{
$vm_set=get-VM -Name $v.VMName
$network_name=$v.NetworkName
$network_adapter= $vm_set | Get-NetworkAdapter -Name $v.Name
$Portgroup=Get-VDPortgroup -Name $v.NetworkName
Set-NetworkAdapter -NetworkAdapter $network_adapter -Portgroup $network_name -Confirm:$false
}

##Добавление оставшегося на старом VDS аплинка в новый VDS
$VDS | Add-VDSwitchPhysicalNetworkAdapter -VMHostPhysicalNic $uplink2 -Confirm:$false

##Удаления старого VDS
Remove-VirtualSwitch -VirtualSwitch 'OLD-DVS-NAME' -Confirm:$false

##Переименование файла CSV в соответствии именем хоста(так на всякий случай что бы сохранить информацию о параметрах сети VM на старом vCenter)
$name_ports_csv='port_'+$ESXiname+'.csv'
Rename-Item -Path 'C:\Temp\powercli\ports.csv' -NewName $name_ports_csv

##Отключаемся от целевого vCenter и можем повторить операцию с другим хостом.
Disconnect-Viserver vcsa-name1 -Confirm:$false