SCRIPTER UN STORAGE VMOTION AVEC DES DATASTORES SPÉCIFIQUES POUR CHAQUE VMDK

SCRIPTER UN STORAGE VMOTION AVEC DES DATASTORES SPÉCIFIQUES POUR CHAQUE VMDK

Je sors un script de migration de VM vers un nouveau SAN que j’ai crée en 2011 pour un très gros client. Il y avait environ 3,000 machines virtuelles.
Le défi était qu’ils ont besoin de déplacer chacun des disques et des fichiers de configs dans des datastores différents.
A la main, il fonctionne bien, avec le GUI, on choisi les options et on fait next, par contre en powerCLI, avec les Move-VM et Set-HardDrive, il faudrait utiliser les deux commandes une apres l’autre et ca veut dire que toute la machine serait déplacé sur le LUN principal (la destination des fichiers de configs vmx) et ensuite utiliser Set-HardDisk pour déplacer les disques dans leurs endroits.
Ca pose des problèmes, dont le temps et le Datastore principal doit être assez gros pour gober temporairement TOUTES la VM… Donc on gaspille ensuite de l’espace et sur des DS8700, à je ne sais pas combien de centaines de mille piasse par mois le Tera… Ca revient cher lol
Alors, j’ai déniché une fonction Relocate_VM qui sert à ca. Ca m’a pris du temps parce que c’est assez ésotérique et merci à LucD sur son blogue qui à répondu à mes emails pour m’aider lol

 

 

1 :

On doit sortir TOUS les disques des VMs sur UNE SEULE LIGNE.
##
Connect-VIserver $args[0]
$report = @()
foreach($vm in Get-VM){
$row = «  » | Select VM
$row.VM = $vm.Name
foreach($hd in (Get-HardDisk -VM $vm)){
Add-Member -InputObject $row -MemberType NoteProperty -Name $hd.Name.Replace(« Hard disk « , »HD ») -Value $hd.Name
Add-Member -InputObject $row -MemberType NoteProperty -Name $hd.Name.Replace(« Hard disk « , »LUN ») -Value $hd.Filename
}
$report += $row
}
$report | Sort-Object -Property {($_ | gm | Measure-Object).Count} -Descending | `
Export-Csv -NoTypeInformation -UseCulture $args[1]
##

Ca sort un csv comme le fichier attaché (premieroutput.csv)

2 :

Une fois qu’on a ca, on ajoute des champs dans Excel (Name en VMName, VM_NEWDS, LUNx_NEWDS, etc) pour permettre d’inscrire les destinations ou on va avoir besoin d’envoyer les disques durs.
Il est important de remplir toutes les cases des disques durs présents dans les VM, même si on ne veut pas déplacer un disque spécifique (mettre le Datastore original), sinon il va être déplacé dans le même que les fichiers de configs. Ca Donnera-le (fichierutiliseparlescript.csv)
3 :

Le script suivant (toujours un powershell) va s’occuper de tout.

##
#Indiquer quel fichier parser
$csvfile = Import-Csv « C:Documents and SettingsMALAbelleMy DocumentsFichiersPourMigrationPRODAllDrivesOnleLineCSV-Stage.csv »
#Connecter au vCenter (nomduscript.ps1 nomduvcenter)
Connect-VIserver vc-stage.psp.int | Out-Null
foreach($line in $csvfile){
$vm = Get-VM $line.VMName
$spec = New-Object VMware.Vim.VirtualMachineRelocateSpec
#Retourner la ManageObjectReference pour le Dastastore pour les fichiers de config
$spec.Datastore = (Get-Datastore $line.VM_NewDS).Extensiondata.MoRef
#Pour chacun des disques il va chercher le champ NEWDS du fichier.
#Si un disque n’a pas de destination de specifiée, il va aller à la même place que les fichiers de configs.
#Si on voulait laisser un vmdk à l’endroit de départ, il faut spécifier l’endroit de départ.
# changer le 16 pour la valeur maximale contenue dans le csv
1..16 | %{
$objDisk = New-Object VMware.Vim.VirtualMachineRelocateSpecDiskLocator
$objDisk.DiskID = $vm.HardDisks[$_ – 1].Id.Split(‘/’)[1]
$dsName = $line.(« LUN » + $_ + « _NEWDS »)
if($dsName -ne «  »){
$objDisk.DataStore = (Get-Datastore $dsName).Extensiondata.MoRef
$spec.Disk += $objDisk
}
}
#quand tout est spécifié, il faut caller le Relocate_VM
$vm.ExtensionData.RelocateVM_Task($spec, « defaultPriority »)
}
##

Voila, il va sortir un paquet d’erreur, mais c’est parce que toutes les machines n’ont pas le meme nombre de disques et le script passe à travers le nombre de disque maximal contenu dans le CSV pour chacune des machines.

Une fois terminé, ca donne le résultat suivant (AllDrivesOnleLineCSV-Stage.xlsx)

Voila

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *