Histoire de convaincre ceux (sans doute rares désormais) qui n’ont pas encore franchi le pas de “PowerCLI”, l’interface de pilotage de vSphere via PowerShell, je vous propose en cette après-midi ensoleillé de découvrir un petit script simple et pragmatique pour déplacer “par paquet” une liste de VMs. Rien de révolutionnaire ici, mais plutôt un moyen beaucoup plus efficace de faire ce genre d’opérations courantes (notamment pendant des phases de migration d’environnement) que via l’interface graphique.
On y va ?..
Le pré-requis est relativement simple : connaître un peu PowerShell (le minimum suffira) et avoir installé la surcouche “PowerCLI” de vSphere (A télécharger ici pour vSphere 6.5).
Une fois installé, connectez-vous à votre vCenter en utilisant la commande “connect-viserver -server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
PowerCLI C:\> connect-viserver -server vcpreprodprd Name Port User ---- ---- ---- vcpreprodprd 443 VSPHERE.LOCAL\Administrator PowerCLI C:\> get-cluster Name HAEnabled HAFailover DrsEnabled DrsAutomationLevel Level ---- --------- ---------- ---------- ------------------ PREPROD True 1 True FullyAutomated PowerCLI C:\> get-cluster | fl AVERTISSEMENT : The 'DrsMode' property of Cluster type is deprecated. Use the 'DrsAutomationLevel' property instead. AVERTISSEMENT : PowerCLI scripts should not use the 'Client' property. The property will be removed in a future release. VsanEnabled : True VsanDiskClaimMode : Manual HATotalSlots : HAUsedSlots : HAAvailableSlots : HASlotCpuMHz : HASlotMemoryMb : HASlotMemoryGB : HASlotNumVCpus : ParentId : Folder-group-h4 ParentFolder : host HAEnabled : True HAAdmissionControlEnabled : False HAFailoverLevel : 1 HARestartPriority : Medium HAIsolationResponse : PowerOff VMSwapfilePolicy : WithVM DrsEnabled : True DrsMode : FullyAutomated DrsAutomationLevel : FullyAutomated EVCMode : intel-ivybridge Name : PREPROD CustomFields : {} ExtensionData : VMware.Vim.ClusterComputeResource Id : ClusterComputeResource-domain-c8 Uid : /VIServer=vsphere.local\administrator@vcpreprodprd:443/Cluster=ClusterComputeResource-domai n-c8/ Client : VMware.VimAutomation.ViCore.Impl.V1.VimClient PowerCLI C:\> |
On peut maintenant utiliser PowerShell et les centaines de CommandLets PowerCLI pour réaliser une migration de VM d’un cluster à un autre (un Storage VMotion, la plupart du temps). Evidemment, les contraintes sont identiques à celles que vous connaissez déjà lorsque vous réalisez cette opération depuis l’interface web : des processeurs cibles compatibles, des portgroups permettant d’assurer une continuité réseau une fois la bascule achevée etc. …
Voila le type de script à taper directement dans le fichier “monbeauscript.ps1” de rigueur :
1 2 3 4 5 6 7 8 9 |
PowerCLI C:\> $vm_list = "vm01","vm02","vm03" $target_ds = Get-Datastore -name "VxRail-Virtual-SAN-Datastore-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx" $target_pg = Get-VDPortGroup -name "MonBoCluster-VLAN42_Srv" $destination = Get-VMHost -name "monesx.vblog.io" foreach ($vm in $vm_list) { get-vm -name $vm | Move-VM -Destination $destination -PortGroup $target_pg -Datastore $target_ds } |
… puis à lancer dans une fenêtre PowerCLI, ensuite, laissez la magie opérer :
1 |
PowerCLI C:\>@monbeauscript.ps1 |
Une fois lancé, le script va prendre chaque machine l’une après l’autre et procéder à son déménagement vers le serveur “monesx.vblog.io”, le datastore “VxRail-Virtual-SAN-Datastore-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx” et changer le portgroup de la carte réseau vers “MonBoCluster-VLAN42_Srv”.
Les experts/puristes auront certainement plein de commentaires (bienvenus) à faire, mais cela permet de lancer la discussion aussi ! Les limitations sont par ailleurs nombreuses : pas de prise en charge de VM disposant de plusieurs interfaces réseau, notamment.
Vous l’aurez compris, j’ai profité de ce petit exercice personnel pour me remettre à PowerShell que je n’avais pas pratiqué depuis longtemps. Le fait est que PowerCLI est un outil extrêmement puissant et finalement très accessible. Nul doute que ces pratique vont tendre à se généraliser chez nous en tout cas.
Vous pouvez trouver toute la doc et la base de référence des CommandLets chez VMware ici.
En espérant que cela aide aussi, à vos claviers :)
Petite rectification à ce super article.
Il est possible de migrer des VM avec plusieurs cartes réseaux en spécifiant l’argument -NetworkAdapter et en lui fournissant un array avec la liste des vmnics et des portgroups de destination
https://blogs.vmware.com/PowerCLI/2017/01/spotlight-move-vm-cmdlet.html
Précision de mon coté, j’ai juste dit que mon mini script ne prenait pas en compte cet aspect des choses, mais effectivement, c’est tout à fait possible avec les APIs. Je rajoute qu’il est également possible de lancer les migrations en arrière plan en ajoutant l’option “-RunAsync” à la commande Move-VM.
Merci Erwan pour ce magnifique commentaire !