Téléchargez dès à présent le document en format pdf
![]() | Article par Cédric Bravo (MVP Virtualisation) Cédric Bravo est actuellement consultant, architecte infrastructure pour une SSII Gold Partner Microsoft et participe au développement d’offres à valeur ajoutée autour des technologies Microsoft. Speaker aux Techdays 2007, 2008 et 2009 ainsi qu'aux Ms Days 2008, Cédric est aussi co-auteur de Scripting Windows aux éditions Eyrolles, un ouvrage didactique et pratique sur l'automatisation en environnement Microsoft ainsi que le co-président du groupe français des utilisateurs de la virtualisation. A ce titre, il participe régulièrement à des articles dans la presses et à des séminaires autours des technologies de virtualisation. Spécialiste de la virtualisation et de l'industrialisation des processus d'exploitation, Cédric apporte sa vision des infrastructures dynamiques auprès de grands groupes Français et internationaux. |
SCVMM est un outil fantastique qui permet la gestion des fermes de serveurs de virtualisation ainsi que les machines virtuelles associées.
Il facilite la gestion des fermes de serveurs Hyper-V, Virtual Server, Vmware VI3 et notamment la prise en charge des environnements de clusters de virtualisation.
![]() |
Bien que la console d’administration graphique ne prévoie pas certains cas de figures spécifiques, l’installation de SCVMM ajoute plus de 130 Command Let Additionnels dédiés à la gestion des machines virtuelles.
![]() |
Très simples à prendre en main, ces nouveaux command let permettent de réaliser des scénarios complexes non pris en charge dans l’interface graphique d’administration.
Dans le cadre d’une migration depuis un Cluster Hyper-V 2008 R1 vers un nouveau cluster Hyper-V 2008 R2, vous souhaitez automatiser le déplacement de vos machines virtuelles.
Le processus de migration est long et fastidieux. Les contraintes sont fortes et il est souvent nécessaire de procéder en horaires non ouvrés pour assurer le transfert de vos machines virtuelles.
Heureusement, PowerShell et les différents Cmdlet de SCVMM 2008 R2 permettent d’automatiser ces tâches efficacement en quelques lignes.
Se connecter au serveur SCVMM.
Pour exécuter des commandes SCVMM, il est nécessaire d’établir une connexion au serveur à l’aide du Cmd-Let « Get-SCVMMServer »
La connexion au serveur SCVMM est un pré requis systématique à toute commande SCVMM.
PS>get-VMMServer "Myserver"
![]() |
| Une fois la connexion invoquée, celle-ci est valable pendant toute la session Powershell. |
Identifier les machines que vous souhaitez migrer.
Avant de réaliser votre script de migration il est nécessaire d’identifier la liste des machines virtuelle à déplacer.
Dans le cadre d’une migration depuis un serveur Hyper-V R1 vers hyper-V R2, vérifier les points suivants :
Note : l’état d’avancement de la fusion des disques n’est pas disponible dans SCVMM, vous devez consulter la console Hyper-V.
Une fois votre liste constituée et vos machines vérifiées, vous pouvez concevoir votre script de migration. Dans un premier temps, nous allons concevoir un script capable de migrer un seule machine, puis, dans la deuxième partie de cet article, nous l’adapterons pour qu’il soit en mesure de migrer toutes les machines définie dans notre fichier.
Pour réaliser cette opération, nous avons besoin de passer par les étapes suivantes.
Etape 1 : Créer un GUID de Job SCVMM
Dans le monde du scripting, les commandes sont exécutées lignes par lignes de manière séquentielle.
SCVMM possède un système de commande « asynchrone », c'est-à-dire qu’il est possible de récupérer la main directement après la prise en compte d’une commande, celle-ci étant mise dans une file de tâches à exécuter en arrière plan, les « Jobs SCVMM ». Certaines commandes SCVMM nécessitent d’êtres groupées au sein d’un même job pour fonctionner. SCVMM assure de manière transparente l’ordonnancement de ces tâches.
Dans SCVMM, chaque job est caractérisé par un identifiant unique, le GUID, pour assigner des tâches à un job, il suffit de lui assigner un identifiant unique.
Pour créer ce GUID, il est nécessaire d’utiliser la classe Dot Net [System::Guid]
$NewJobGroup = [System.Guid]::NewGuid()
Etape 2 : Stopper la machine virtuelle.
Lors d’une migration d’un cluster Hyper-V à un autre, la machine doit être stoppée (en effet la migration live n’est disponible qu’au sein d’un même cluster). De plus le scénario illustré ici concerne le déplacement de machines virtuelles située sur un cluster Hyper-V R1, vers un cluster Hyper-V R2 (utilisant des ClusteredShared Volumes).
Dans un premier temps, nous allons récupérer l’objet qui représente notre machine virtuelle avec le Cmd-Let Get-VM, puis nous pourrons l’arrêter proprement à l’aide du Cmd-Let Shutdown-VM.
L’objet machine virtuelle ainsi récupéré pourra nous servir pour des usages futurs dans notre script.
#Récupérer l’objet machine virtuelle.
$VmName= "Nom de la machine virtuelle à stopper"
$VM = Get-Vm $VmName
#Stopper la machine virtuelle
Shutdown-VM $VM
Etape 3 : Reconfigurer les cartes réseau
Lors du déplacement, il est nécessaire de reconfigurer les attachements réseau des cartes virtuelles afin de les raccorder au nouveau réseau disponible sur la machine cible.
Dans un premier temps, nous allons récupérer les objets représentant nos cartes réseaux à l’aide du Cmd-Let Get-VirtualNetworkAdapter. Puis nous utiliserons le Cmd-Let Set-VirtualNetworkAdapter pour reconfigurer la carte réseau.
Comme le nouveau réseau ne sera disponible qu’une fois la machine virtuelle déplacée sur le nouveau serveur Hyper-V, nous allons préciser que nous souhaitons une exécution asynchrone et assigner la reconfiguration de notre carte au GUID de job récupéré précédemment.
Le paramètre « -All » du Cmd-Let Get-VirtualNetwokAdapter stipule que nous souhaitons récupérer toutes les cartes réseau de toutes les machines virtuelles gérées par SCVMM.
#Récupération des objets cartesréseau
$VirtualNetworkAdapter= Get-VirtualNetworkAdapter -All | where {$_.name -eq $vm.name}
Set-VirtualNetworkAdapter-VirtualNetworkAdapter $VirtualNetworkAdapter –VirtualNetwork "Nom_Lan_Cible" -RunAsynchronously -JobGroup $NewJobGroup
Note : La variable “$_” représente l’objet en cour passé à travers le « pipe » lors de chaque itération. Ici nous récupérons tous les objets carte réseau gérés par SCVMM, puis nous filtrons ces objets pour ne retenir que ceux dont la propriété « Name » est égale à la propriété « Name » de notre objet $VM. En effet, la propriété « Name » des objets carte réseau est identique à la propriété « Name » des machines virtuelles.
La commande sera mise en file d’attente et ordonnancée automatiquement par SCVMM à la suite de la commande Move-VM que nous allons utiliser plus bas.
Attention, si votre machine virtuelle comporte plus d’une carte réseau, la variable $VirtualNetworkAdapter ne contiendra pas un objet « Carte réseau » mais un tableau d’objet carte réseau.
Pour palier à cette éventualité, il convient de traiter le résultat comme suit.
#Récupération des objets cartesréseau
$VirtualNetworkAdapters= Get-VirtualNetworkAdapter -All | where {$_.name -eq $vm.name}
$VirtualNetworkAdapters|Foreach{
Set-VirtualNetworkAdapter-VirtualNetworkAdapter $_ -VirtualNetwork "Nom_Lan_Cible" -RunAsynchronously -JobGroup $NewJobGroup
}
Cependant, ce script ne fonctionne que si vos cartes sont toutes reliées sur le même réseau. Dans le cas contraire, il est nécessaire de gérer de nouvelles conditions (par exemple avec le nom du réseau sur lequel la machine est actuellement connecté, récupérable par la propriété « VirtualNetwork »)
#Récupération des objets carte réseau
$VirtualNetworkAdapters= Get-VirtualNetworkAdapter -All | where {$_.name -eq $vm.name}
$VirtualNetworkAdapters|Foreach{
switch($VirtualNetworkAdapters.VirtualNetWork){
"Nom_LAN1" {
Set-VirtualNetworkAdapter -VirtualNetworkAdapter $_ -VirtualNetwork "Nom_Lan_Cible1" -RunAsynchronously -JobGroup $NewJobGroup
}
"Nom_LAN2" {
Set-VirtualNetworkAdapter -VirtualNetworkAdapter $_ -VirtualNetwork "Nom_Lan_Cible2" -RunAsynchronously -JobGroup $NewJobGroup
}
}
}
Ici, nous récupérons le nom du réseau sur lequel la carte est connectée et nous la reconfigurons sur le réseau cible en fonction de ce nom. La fonction « Switch » nous permet ici de préciser une action spécifique pour différente valeur renvoyée par la propriété « VirtualNetwork »
Etape 4 : Déplacer la machine virtuelle
Voila enfin le moment de demander le déplacement de notre machine virtuelle.
Le déplacement de la machine virtuelle est effectué grâce au Cmd-Let Move-VM en précisant le nom de la machine virtuelle ($VM.name), le serveur Hyper-V ciblé et le volume sur lequel sera stocké la machine virtuelle.
Nous n’oublierons pas non plus d’indiquer une exécution asynchrone de la commande en y associant le GUID du job créé précédemment.
Le paramètre « –UseLAN » indique que le transfert s’effectuera par le réseau.
Move-VM -VM $VM.name -VMHost$VMHost -Path "C:\ClusterStorage\Volume1" –UseLAN -RunAsynchronously -JobGroup $NewJobGroup
That’s it !
Nous venons de migrer notre première machine virtuelle entièrement à l’aide de la ligne de commande !
Ok, ne nous emballons pas trop, il reste encore à attendre la fin de la migration et à redémarrer manuellement la machine. De plus, migrer une seule machine virtuelle par ligne de commande n’est pas d’un grand intérêt.
Pour cette raison nous verrons dans la prochaine partie de cet article comment constituer une liste de machine virtuelle pour alimenter notre script et comment suivre l’avancement des jobs de façon à automatiser le déplacement d’un grand nombre de machines.