VMware: Migrate vSphere hosts to new ip subnet, new DNS servers, new gateway and rejoin vCenter server with PowerCLI
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:
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"
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
Nice script! Gonna try
Wonderful, you automated my new project :p thnx!
Cool info! I have already been hunting for something like this for a time now. With thanks!
Thanks a bunch for sharing this script
thnx for posting, used alot of you’re code
Great script, gonna use this one
Tested but this was not what I was looking for
Anyway, nice script with easy GUI
Hi,
Can I change the IP address, mask etc of a Virtual Machine using PowerCLI when its powered on?
Thx.
Sal
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
Very nice blog post. I absolutely love this website.
Stick with it!
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