VMware: Migrate vSphere hosts to new ip subnet, new DNS servers, new gateway and rejoin vCenter server with PowerCLI

13

Last month I’ve wrote a script for a company that is merging with a new company in a different datacenter, that means new ip-addresses, new subnet, new gateway, new DNS servers and rejoin vCenter server.. my part was to migrate all (60) VMware vSphere hosts to the new subnet and rejoin the vSphere vCenter cluster… without downtime!

Function:

#Connect to vCenter server
— Specify host
— Enter Host Standby mode
— Move all VM’s to other hosts in cluster
— Re-balance with DRS
— Disconnect host
— Remove host from cluster

#Connect to ESXi Server
— Add new VMKernel Management Network with new range in vSwitch0
— Enable Management option for new VMkernel
— Configure NIC Teaming policy
— Configure new DNS servers
— Configure new VMkernel gateway
— Reboot host

#MANUAL ACTION: Update DNS records at configured DNS servers

#Connect to vCenter server
— Add new record in vCenter server host file with new host ipaddress Management VMkernel
— Add host with new VMkernel Management Network
— Delete old VMkernel from vSwitch0
— Exit Host Standby mode
— Rebalance cluster with DRS

#Script finished
— Next host…>


The script
:

#====================================================================#
#   SCRIPT:       VMware_vSphere_IP_Redesign_v.1.0.ps1               #
#   AUTHOR:       S.Daems - VMpros.nl                                #
#   CREATED:      22/01/2012                                         #
#   MODIFIED:     30/01/2012                                         #
#   VERSION:      v.1.0                                              #
#                                                                    #
#====================================================================#
#   CHANGELOG:                                                       #
#                                                                    #
#    v.1.0                                                           #
#     - Script created                                               #
#                                                                    #
#====================================================================#
#   FUNCTION:                                                        #
#                                                                    #
#   #Connect to vCenter server                                       #
#     Specify host                                                   #
#     Enter Host Standby mode                                        #
#     Move all VM's to other hosts in cluster                        #
#     Re-balance with DRS                                            #
#     Disconnect host                                                #
#     Remove host from cluster                                       #
#                                                                    #
#   #Connect to ESXi Server                                          #
#     Add new VMKernel Management Network with new range in vSwitch0 #
#     Enable Management option for new VMkernel                      #
#     Configure NIC Teaming policy                                   #
#     Configure new DNS servers                                      #
#     Configure new VMkernel gateway                                 #
#     Reboot host                                                    #
#                                                                    #
#   #MANUAL ACTION: Update DNS records at configured DNS servers     #
#                                                                    #
#   #Connect to vCenter server                                       #
#     Add new record in vCenter server host file with new host ip-   #
#     address Management VMkernel                                    #
#     Add host with new VMkernel Management Network                  #
#     Delete old VMkernel from vSwitch0                              #
#     Exit Host Standby mode                                         #
#     Rebalance cluster with DRS                                     #
#                                                                    #
#   #Script finished                                                 #
#     Next host...>                                                  #
#                                                                    #
#====================================================================#
#   NOTE:                                                            #
#                                                                    #
#     - Run this script first in a test environment                  #
#     - Make sure youre ESXi host - vSwitch0 have multiple pNIC's    #
#       and can access both networks/gateway's                       #
#     - Don't forgot to update vCenter Cluster das.isolationaddress2 #
#       if vCenter is configured in a new subnet                     #
#     - Don't forgot to update DNS (A) records at your DNS servers   #
#       with with new ESXi host Management ip-addresses              #
#     - Check if the correct pNIC's are configured for NIC Teaming   #
#     - Check if the correct VMkernel is selected for gateway config #
#     - This script is written with VMware vSphere PowerCLI 5.0.0    #
#                                                                    #
#====================================================================#
#   CUSTOM DEFINITIONS                                               #
#====================================================================#
$vCenterServer = "vCENTER SERVER NAME BY DNS"
$vCenterUsername = "vCENTER DOMAIN\USERNAME"
$vCenterPassword = "vCENTER PASSWORD"
$vCenterDatacenter = "vCENTER DATACENTER NAME"
$vCenterCluster = "vCENTER CLUSTERNAME"
$ESXiHost = "ESXi HOSTS BY DNS"
$RootUser = "ROOT USER ACCOUNT TO CONFIGURE/CONNECT HOST"
$RootPassword = "ROOT PASSWORD TO CONFIGURE/CONNECT HOST"
$Old_MGMT_Network = "ORIGINAL MANAGEMENT VMKERNEL NAME"
$New_MGMT_Network = "NEW MANAGEMENT VMKERNEL IPADDRESS"
$New_MGMT_Subnet = "NEW MANAGEMENT VMKERNEL SUBNET"
$New_VMK_Gateway = "NEW MANAGEMENT VMKERNEL GATEWAY"
$New_DNS01 = "NEW PRIMARY DNS SERVER TO CONFIGURE"
$New_DNS02 = "NEW SECUNDARY DNS SERVER TO CONFIGURE"
New-VICredentialStoreItem -Host "$vCenterServer" -User "$vCenterUsername" -Password "$vCenterPassword" | out-null
New-VICredentialStoreItem -Host "$ESXiHost" -User "$RootUser" -Password "$RootPassword" | out-null
Write-Host "Script will start..." -foregroundcolor yellow

#====================================================================#
#   FASE 1  - vCENTER: MAINTENANCE AND REMOVE HOST FROM vCENTER      #
#====================================================================#
Write-Host "Connect to vCenter Server" -foregroundcolor green
#====================================================================#
Connect-VIServer "$vCenterServer" | out-null
Sleep 10
#====================================================================#
Write-Host "Enter host in Maintenance mode" -foregroundcolor green
#====================================================================#
Set-VMHost "$ESXiHost" -State "Maintenance" -RunAsync | out-null
#====================================================================#
Write-Host "Disconnect host from vCenter Server" -foregroundcolor green
#====================================================================#
Set-VMHost "$ESXiHost" -State "Disconnected" -RunAsync | out-null
#====================================================================#
Write-Host "Tell DRS to re-balance VMs including the rejoined host" -foregroundcolor green
#====================================================================#
Get-DrsRecommendation -Cluster "$vCenterCluster" | where {$_.Reason -eq "Host is entering maintenance mode"} | Apply-DrsRecommendation | out-null
#====================================================================#
Write-Host "Remove host from vCenter Server" -foregroundcolor green
#====================================================================#
Remove-VMHost "$ESXiHost" -Confirm:$false | out-null
#====================================================================#
Write-Host "Disconnect from vCenter Server" -foregroundcolor green
#====================================================================#
Disconnect-VIServer -Confirm:$False | out-null

#====================================================================#
#   FASE 2 - HOST: RE-CONFIGURE MANAGEMENT NETWORK                   #
#====================================================================#
Write-Host "Connect directly to ESXi host" -foregroundcolor green
#====================================================================#
Connect-VIServer "$ESXiHost" | out-null
Sleep 10
#====================================================================#
Write-Host "Configure new management network" -foregroundcolor green
#====================================================================#
Get-VMHost "$ESXiHost" | New-VMHostNetworkAdapter -VirtualSwitch "vSwitch0" -PortGroup "MGMT Network" -IP "$New_MGMT_Network" -SubnetMask "$New_MGMT_Subnet" -ManagementTrafficEnabled:$true -Confirm:$false | out-null
#====================================================================#
Write-Host "Configure vSwitch0 - MGMT NIC Teaming Policy" -foregroundcolor green
#====================================================================#
Get-VMHost "$ESXiHost" | Get-VirtualPortGroup -name "MGMT Network" | Get-NicTeamingPolicy | Set-NicTeamingPolicy -MakeNicActive vmnic0 | out-null
Get-VMHost "$ESXiHost" | Get-VirtualPortGroup -name "MGMT Network" | Get-NicTeamingPolicy | Set-NicTeamingPolicy -MakeNicStandby vmnic2 | out-null
#====================================================================#
Write-Host "Configure new DNS servers" -foregroundcolor green
#====================================================================#
Get-VMHost "$ESXiHost" | Get-VMHostNetwork | Set-VMHostNetwork -DnsAddress "$New_DNS01","$New_DNS02" | out-null
#====================================================================#
Write-Host "Change VMkernel Gateway" -foregroundcolor green
#====================================================================#
$net = Get-VMHostNetwork
$net | Set-VMHostNetwork -VMKernelGateway "$New_VMK_Gateway" -VMKernelGatewayDevice "vmk2" | out-null
#====================================================================#
Write-Host "Reboot ESXi Host" -foregroundcolor green
#====================================================================#
Restart-VMHost -VMHost "$ESXiHost" -Confirm:$false | out-null
#====================================================================#
Write-Host "Disconnect from ESXi host" -foregroundcolor green
#====================================================================#
Disconnect-VIServer -Confirm:$False | out-null
Write-Host "Update DNS (A) records at you're Domain Controller with new ESXi ipaddress, otherwise the script will fail..!!" -foregroundcolor white
Write-Host "Update DNS (A) records at you're Domain Controller with new ESXi ipaddress, otherwise the script will fail..!!" -foregroundcolor white
Write-Host "Update DNS (A) records at you're Domain Controller with new ESXi ipaddress, otherwise the script will fail..!!" -foregroundcolor white
Sleep 360

#====================================================================#
#   FASE 3  - vCENTER: EXIT MAINTENANCE AND RE-ADD HOST TO vCENTER   #
#====================================================================#
Write-Host "Connect to vCenter Server" -foregroundcolor green
#====================================================================#
Connect-VIServer "$vCenterServer" | out-null
Sleep 10
#====================================================================#
Write-Host "New Management Network to vCenter Server host file" -foregroundcolor green
#====================================================================#
$hostsPath = “$env:windir\System32\drivers\etc\hosts”
$hosts = get-content $hostsPath
$string = “$New_MGMT_Network             $ESXiHost”
$hosts = $hosts + $string
$hosts | Out-File $hostsPath -enc ascii
#====================================================================#
Write-Host "Add ESXi host to vCenter Server" -foregroundcolor green
#====================================================================#
Add-VMHost "$ESXiHost" -location (Get-Datacenter -name "$vCenterDatacenter" | Get-Cluster -name "$vCenterCluster") -user root -password $RootPassword -force | out-null
#====================================================================#
Write-Host "Remove old Management Network from host" -foregroundcolor green
#====================================================================#
#$vNic = Get-VMHostNetworkAdapter -VMHost $ESXiHost | where {$_.PortgroupName -eq $Old_MGMT_Network} | out-null
#Remove-VMHostNetworkAdapter -Nic $vNic | out-null
#====================================================================#
Write-Host "Exit host from Maintenance mode" -foregroundcolor green
#====================================================================#
Set-VMHost "$ESXiHost" -State "Connected" -RunAsync | out-null
#====================================================================#
Write-Host "Tell DRS to re-balance VMs including the rejoined host" -foregroundcolor green
#====================================================================#
Get-DrsRecommendation -Cluster "$vCenterCluster" | where {$_.Reason -eq "Host is entering maintenance mode"} | Apply-DrsRecommendation | out-null
#====================================================================#
Write-Host "Disconnect from vCenter Server" -foregroundcolor green
#====================================================================#
Disconnect-VIServer -Confirm:$False | out-null

#====================================================================#
#   FASE 4  - SCRIPT FINISHED                                        #
#====================================================================#
Write-Host "Script finished, please check error log..." -foregroundcolor yellow
#====================================================================#

The script is finished:

image

Custom settings:

$vCenterServer = "vCENTER SERVER NAME BY DNS"
$vCenterUsername = "vCENTER DOMAIN\USERNAME"
$vCenterPassword = "vCENTER PASSWORD"
$vCenterDatacenter = "vCENTER DATACENTER NAME"
$vCenterCluster = "vCENTER CLUSTERNAME"
$ESXiHost = "ESXi HOSTS BY DNS"
$RootUser = "ROOT USER ACCOUNT TO CONFIGURE/CONNECT HOST"
$RootPassword = "ROOT PASSWORD TO CONFIGURE/CONNECT HOST"
$Old_MGMT_Network = "ORIGINAL MANAGEMENT VMKERNEL NAME"
$New_MGMT_Network = "NEW MANAGEMENT VMKERNEL IPADDRESS"
$New_MGMT_Subnet = "NEW MANAGEMENT VMKERNEL SUBNET"
$New_VMK_Gateway = "NEW MANAGEMENT VMKERNEL GATEWAY"
$New_DNS01 = "NEW PRIMARY DNS SERVER TO CONFIGURE"
$New_DNS02 = "NEW SECUNDARY DNS SERVER TO CONFIGURE"


About Author

13 thoughts on “VMware: Migrate vSphere hosts to new ip subnet, new DNS servers, new gateway and rejoin vCenter server with PowerCLI

  1. Man this script is amazing, we’re busy atm with exactly the same migration.. merging to new datacenter

    I’ve tested this script in our test environment and it works like a charm!! Thank you very very much!!

    Note: You are using signed SSL certificates isn’t it? I got SSL message because the SSL cert is self signed 🙂 anyway… wunderfull script, this saved me many many hours. I’ve added some code because we also need to configure a new vMotion network

  2. Thank you very very much for sharing. I am in similar situation right now where I have to readdress many ESXi hosts.

    Does this procedure cause any outage for VMs? I guess not, but I am not sure.
    The only outage should be for Mgmt access, right?

    What is the reason that your script creates a new vmkernel port instead of just changing the existing port settings?
    Why is a reboot of the ESXi host necessary?

    Does the readdressing also work without putting the host into maintenance mode and moving all VMs to another host? The VMs should be unaffected by changing the Mgmt vmkernel settings, right?
    So my suggestion for the procedure would be as follows:
    – disable HA and DRS
    – remove host from cluster and from vCenter
    – change IP address on host itself
    – add it again to vCenter

    Am I missing something or making a mistake?
    Unfortunately I could not find any official documentation on the matter of changing the Mgmt vmkernel IP/VLAN settings.

    Any help is very much appreciated 🙂
    Best regards, Patrick

  3. thak you very much for this post. you’re helping a lot of people with it. I have a question regarding vmkernal. You saying that you’re creating a new vmkernal in vswitch 0 with the new ip @ (which is in a new subnet). then you delete the old one. after that you rejoin the ESXi to the cluster and enable DRS which means some VMS will migrate to this host. How is that possible with different VMkernal on different subnets???

    Please I’d appreciate yu reply, as I am newbie to this and I’m conducting an impact report.

    Thank you

Leave a Reply

Your email address will not be published. Required fields are marked *