TIP : Déplacer un groupe de VMs via PowerCLI

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  » et en rentrant vos credentials. Vous êtes prêt à passer des ordres directs à vCenter. Pour le vérifier, vous pouvez, par exemple demander la liste de vos clusters :

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 :

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 :

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 :)