{"id":313,"date":"2015-04-26T03:14:54","date_gmt":"2015-04-26T07:14:54","guid":{"rendered":"http:\/\/www.hoplawego.com\/blog\/?p=313"},"modified":"2015-04-29T14:28:14","modified_gmt":"2015-04-29T18:28:14","slug":"scripter-un-storage-vmotion-avec-des-datastores-specifiques-pour-chaque-vmdk","status":"publish","type":"post","link":"https:\/\/www.hoplawego.com\/blog\/scripter-un-storage-vmotion-avec-des-datastores-specifiques-pour-chaque-vmdk\/","title":{"rendered":"SCRIPTER UN STORAGE VMOTION AVEC DES DATASTORES SP\u00c9CIFIQUES POUR CHAQUE VMDK"},"content":{"rendered":"<p>Je sors un script de migration de VM vers un nouveau SAN que j\u2019ai cr\u00e9e en 2011 pour un tr\u00e8s gros client. Il y avait environ 3,000 machines virtuelles. <span id=\"more-670\"><\/span><br \/>\nLe d\u00e9fi \u00e9tait qu\u2019ils ont besoin de d\u00e9placer chacun des disques et des fichiers de configs dans des datastores diff\u00e9rents.<br \/>\nA 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\u2019autre et ca veut dire que toute la machine serait d\u00e9plac\u00e9 sur le LUN principal (la destination des fichiers de configs vmx) et ensuite utiliser Set-HardDisk pour d\u00e9placer les disques dans leurs endroits.<br \/>\nCa pose des probl\u00e8mes, dont le temps et le Datastore principal doit \u00eatre assez gros pour gober temporairement TOUTES la VM\u2026 Donc on gaspille ensuite de l\u2019espace et sur des DS8700, \u00e0 je ne sais pas combien de centaines de mille piasse par mois le Tera\u2026 Ca revient cher lol<br \/>\nAlors, j\u2019ai d\u00e9nich\u00e9 une fonction Relocate_VM qui sert \u00e0 ca. Ca m\u2019a pris du temps parce que c\u2019est assez \u00e9sot\u00e9rique et merci \u00e0 LucD sur son blogue qui \u00e0 r\u00e9pondu \u00e0 mes emails pour m\u2019aider lol<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>1 :<\/p>\n<h6>On doit sortir TOUS les disques des VMs sur UNE SEULE LIGNE.<br \/>\n<em>##<\/em><br \/>\n<em>Connect-VIserver $args[0]<\/em><\/h6>\n<h6><em>$report = @()<\/em><br \/>\n<em>foreach($vm in Get-VM){<\/em><br \/>\n<em>$row = \u00ab\u00a0\u00a0\u00bb | Select VM<\/em><br \/>\n<em>$row.VM = $vm.Name<\/em><br \/>\n<em>foreach($hd in (Get-HardDisk -VM $vm)){<\/em><br \/>\n<em>Add-Member -InputObject $row -MemberType NoteProperty -Name $hd.Name.Replace(\u00ab\u00a0Hard disk \u00ab\u00a0,\u00a0\u00bbHD\u00a0\u00bb) -Value $hd.Name<\/em><br \/>\n<em>Add-Member -InputObject $row -MemberType NoteProperty -Name $hd.Name.Replace(\u00ab\u00a0Hard disk \u00ab\u00a0,\u00a0\u00bbLUN\u00a0\u00bb) -Value $hd.Filename<\/em><br \/>\n<em>}<\/em><br \/>\n<em>$report += $row<\/em><br \/>\n<em>}<\/em><br \/>\n<em>$report | Sort-Object -Property {($_ | gm | Measure-Object).Count} -Descending | `<\/em><br \/>\n<em>Export-Csv -NoTypeInformation -UseCulture $args[1]<\/em><br \/>\n<em>##<\/em><\/h6>\n<p>Ca sort un csv comme le fichier attach\u00e9 (premieroutput.csv)<\/p>\n<p>2 :<\/p>\n<p>Une fois qu\u2019on a ca, on ajoute des champs dans Excel (Name en VMName, VM_NEWDS, LUNx_NEWDS, etc) pour permettre d\u2019inscrire les destinations ou on va avoir besoin d\u2019envoyer les disques durs.<br \/>\nIl est important de remplir toutes les cases des disques durs pr\u00e9sents dans les VM, m\u00eame si on ne veut pas d\u00e9placer un disque sp\u00e9cifique (mettre le Datastore original), sinon il va \u00eatre d\u00e9plac\u00e9 dans le m\u00eame que les fichiers de configs. Ca Donnera-le (fichierutiliseparlescript.csv)<br \/>\n3 :<\/p>\n<p>Le script suivant (toujours un powershell) va s\u2019occuper de tout.<\/p>\n<h6><em>##<\/em><br \/>\n<em>#Indiquer quel fichier parser<\/em><br \/>\n<em>$csvfile = Import-Csv \u00ab\u00a0C:Documents and SettingsMALAbelleMy DocumentsFichiersPourMigrationPRODAllDrivesOnleLineCSV-Stage.csv\u00a0\u00bb<\/em><\/h6>\n<h6><em>#Connecter au vCenter (nomduscript.ps1 nomduvcenter)<\/em><br \/>\n<em>Connect-VIserver vc-stage.psp.int | Out-Null<\/em><\/h6>\n<h6><em>foreach($line in $csvfile){<\/em><br \/>\n<em>$vm = Get-VM $line.VMName<\/em><\/h6>\n<h6><em>$spec = New-Object VMware.Vim.VirtualMachineRelocateSpec<\/em><\/h6>\n<h6><em>#Retourner la ManageObjectReference pour le Dastastore pour les fichiers de config<\/em><br \/>\n<em>$spec.Datastore = (Get-Datastore $line.VM_NewDS).Extensiondata.MoRef<\/em><\/h6>\n<h6><em>#Pour chacun des disques il va chercher le champ NEWDS du fichier.<\/em><br \/>\n<em>#Si un disque n\u2019a pas de destination de specifi\u00e9e, il va aller \u00e0 la m\u00eame place que les fichiers de configs.<\/em><br \/>\n<em>#Si on voulait laisser un vmdk \u00e0 l\u2019endroit de d\u00e9part, il faut sp\u00e9cifier l\u2019endroit de d\u00e9part.<\/em><br \/>\n<em># changer le 16 pour la valeur maximale contenue dans le csv<\/em><\/h6>\n<h6><em>1..16 | %{<\/em><br \/>\n<em>$objDisk = New-Object VMware.Vim.VirtualMachineRelocateSpecDiskLocator<\/em><br \/>\n<em>$objDisk.DiskID = $vm.HardDisks[$_ \u2013 1].Id.Split(\u2018\/\u2019)[1]<\/em><br \/>\n<em>$dsName = $line.(\u00ab\u00a0LUN\u00a0\u00bb + $_ + \u00ab\u00a0_NEWDS\u00a0\u00bb)<\/em><br \/>\n<em>if($dsName -ne \u00ab\u00a0\u00a0\u00bb){<\/em><br \/>\n<em>$objDisk.DataStore = (Get-Datastore $dsName).Extensiondata.MoRef<\/em><br \/>\n<em>$spec.Disk += $objDisk<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><\/h6>\n<h6><em>#quand tout est sp\u00e9cifi\u00e9, il faut caller le Relocate_VM<\/em><br \/>\n<em>$vm.ExtensionData.RelocateVM_Task($spec, \u00ab\u00a0defaultPriority\u00a0\u00bb)<\/em><br \/>\n<em>}<\/em><br \/>\n<em>##<\/em><\/h6>\n<p>Voila, il va sortir un paquet d\u2019erreur, mais c\u2019est parce que toutes les machines n\u2019ont pas le meme nombre de disques et le script passe \u00e0 travers le nombre de disque maximal contenu dans le CSV pour chacune des machines.<\/p>\n<p>Une fois termin\u00e9, ca donne le r\u00e9sultat suivant (AllDrivesOnleLineCSV-Stage.xlsx)<\/p>\n<p>Voila<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je sors un script de migration de VM vers un nouveau SAN que j\u2019ai cr\u00e9e en 2011 pour un tr\u00e8s gros client. Il y avait environ 3,000 machines virtuelles. Le d\u00e9fi \u00e9tait qu\u2019ils ont besoin de d\u00e9placer chacun des disques et des fichiers de configs dans des datastores diff\u00e9rents. A la main, il fonctionne bien, &hellip; <\/p>\n","protected":false},"author":1,"featured_media":314,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[39,38],"class_list":["post-313","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vmware","tag-powercli","tag-powershell","grid-sizer"],"_links":{"self":[{"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/posts\/313","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/comments?post=313"}],"version-history":[{"count":1,"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/posts\/313\/revisions"}],"predecessor-version":[{"id":315,"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/posts\/313\/revisions\/315"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/media\/314"}],"wp:attachment":[{"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/media?parent=313"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/categories?post=313"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hoplawego.com\/blog\/wp-json\/wp\/v2\/tags?post=313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}