bei einem grossen kunde stand letzte woche ein umzug der rechner infrastruktur (17 esx server, 3 fc storages mit insgesamt knapp 100TB, etwa 660VMs) an; ansich relativ einfach, es sollten aber knapp 100 infrastruktur vms (printserver, wlan radius, mailserver etc..) unterbrechungsfrei weiterlaufen; zwischen dem neuen rechnerraum und den alten 2 raeumen bestand nur eine ethernetstrecke, kein darkfiber/fibrechannel zur verfuegung.
die loesung: ein temporaerer iscsi server und eine handvoll powercli scripte fuer den umzug der vms. und ja, es gibt sicherlich auch noch andere wege das zu loesen, soll nur als anregung dienen.
als erstes wurde das komplette inventory als csv datei exportiert:
$vc = 'localhost';
Connect-VIServer $vc -credential $host.ui.PromptForCredential("vCenter login",
"vCenter login ('$vc')", "", "") > $NULL 2>&1
"ResourcePool, VMName, Datastore_old, Datastore_new, VMHost_old,
VMHost_new,Prio,PowerState";
$rps = Get-ResourcePool -Location 'Muenzstrasse'
foreach ($rp in $rps) {
$vms = Get-VM -Location $rp;
foreach ($vm in $vms) {
$vm_temp = Get-VM $vm.name;
$name = $vm_temp.name;
$powerstate = $vm_temp.powerstate;
$storage = Get-Datastore -VM $name;
$vmhost = Get-VMHost -VM $name;
$rpname = Get-ResourcePool -VM $name;
"$rpname,$name,$storage,,$vmhost,,$powerstate";
}
}
[vSphere PowerCLI] D:\VMWare\scripts> .\scan_inventory.ps1 > inventory_20110822.csv
in der entstandene datei wurden dann 4 prioritaeten vergeben:
high -- die vms muessen durchlaufen;
medium -- vms koennen suspended werden und dann via storage migration verschoben werden;
low -- die vms koennen fuer die dauer des umzuges des ersten storages abgeschalten werden;
off -- die vms sind abgeschalten und muessen nicht auf den storages verschoben werden;
ueber 'VMHost_new' und 'Datastore_new' wird gesteuert, welche vm auf welchem server und datastore
liegen soll; "low vms" sollen alle auf die ersten umziehenden esx server und fc storage luns,
medium und high respektive auf die vorerste verbleibenden maschinen verschoben werden (sofern nicht
schon so verteilt); "high" werden auf die temporaeren iSCSI datastores verschoben, "medium" verbleibt
auf den normalen fc datastores.
$vms = Import-CSV D:\VMWare\scripts\inventory_20110822.csv
foreach ($vm in $vms){
if ( $vm.VMhost_new && $vm.Datastore_new) {
$name = $vm.name;
$vmhost = $vm.VMHost_new;
Move-VM -Destination ( Get-VMHost $vmhost) -VM $name;
Move-VM -Destination $vm.ResourcePool -VM $name;
Move-VM -Destination $vm.Datastore_new -VM $name;
}
}
am tag des umzuges wurden dann alle "low vms" suspenden, die maschinen umgebaut und wieder
resumed:
$vms = Import-CSV D:\VMWare\scripts\inventory_20110822.csv
foreach ($vm in $vms){
if ( $vm.Prio -eq "low") {
Suspend-VM -VM $vm.Name -Confirm:false;
}
}
...
$vms = Import-CSV D:\VMWare\scripts\inventory_20110822.csv
foreach ($vm in $vms){
if ( $vm.Prio -eq "low") {
Start-VM -VM $vm.Name -Confirm;
}
}
"medium vms" wurden kurz suspended, migriert und wieder in betrieb genommen, nachdem beide inseln
parallel liefen, "high vms" direkt verschoben:
$vms = Import-CSV D:\VMWare\scripts\inventory_20110822.csv
foreach ($vm in $vms){
if ( $vm.Prio -eq "medium" && $vm.Prio -eq "high" ) {
write-host "moving '$vm.ResourcePool/$vm.Name' from '$vm.Datastore_new' to
'$vm.Datastore_new'";
if ( $vm.Prio -eq "medium" ) {
Suspend-VM $vm.Name -Confirm:$false
}
Move-VM -VM $vm.Name -Destination $vm.VMHost_new -Datastore $vm.Datastore_new
-DiskStorageFormat thin;
Move-VM -VM $vm.Name -Destination $vm.ResourcePool;
if ( $vm.Prio -eq "medium" ) {
Start-VM -VM $vm.Name;
}
}
}
als dann die "alte seite" leer war, wurde auch das 2. rack mit den machinen physikalisch umgebaut.