Partagez l'article

Connexion






Mot de passe oublié ?
Identifiant oublié ?
Pas encore inscrit ? Créer un compte

Up-coming events

There are no up-coming events

Automatiser la migration de vos machines virtuelles avec SCVMM 2008R2 (Part 2-2) PDF Imprimer Envoyer
Note des utilisateurs: / 8
MauvaisTrès bien 

System Center Virtual Machine Manager 2008 R2 (SCVMM) – Automatiser la migration de vos machines virtuelles (Partie 2-2)

Rappel de l’épisode précédent (Automatiser la migration de vos machines virtuelles avec SCVMM 2008 R2 Part 1-2)           

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 horaires 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.

Dans la première partie de cet article, nous avons vu comment effectuer les opérations suivantes grâce à Powershell.

 

  • Créer un GUID de job SCVMM
  • Stopper une machine virtuelle
  • Récupérer et reconfigurer ses cartes réseau virtuelles
  • Déplacer la machine virtuelle

 

Dans cette partie, nous allons voir comment il est possible de réutiliser ces connaissances pour déplacer un grand nombre de machine de façon automatique.

Pour cela, nous allons d’abord étudier comment créer une liste de machines virtuelles.

Ensuite, nous verrons comment exécuter notre script de migration pour chacune d’entre elles.

Nous verrons aussi comment tirer partis des fonctionnalités asynchrones de SCVMM pour obtenir des informations sur l’avancement du déplacement pour chaque machine.

 

Etape 1 : Créer une liste de machine à déplacer

Il existe de nombreuses méthodes pour créer sa liste de machine à déplacer, vous pouvez par exemple interroger SCVMM pour qu’il vous donne la liste des machines virtuelles hébergée sur un serveur Hyper-V en particulier.

 

# Connexion au serveur SCVMM (La connexion est valable pour toute la session powershell)

Get-VMMServer "Nom Du serveur SCVMM"

Get-VM |Where{$_.hostName –eq "Nom du serveur Hyper-V"}|forEach{$_.name} >ListeVM.txt

 

Le script ci-dessous permet d’obtenir rapidement un fichier contenant la liste des machines virtuelles présente sur un serveur Hyper-V donné.

Vous pouvez aussi tout simplement créer votre fichier manuellement, l’important étant que les noms de machines relevées correspondent exactement aux noms de machines définis dans SCVMM.

Dans le cadre d’une migration assurez-vous qu’aucun des points suivants ne soit vrai, ils pourraient faire échouer le déplacement :

·         Présence d’images ISO dans les lecteurs CDROM des machines

·         Présences de points de restauration non compatibles avec la version du serveur cible

·         Machines virtuelles en état « pause » ou en « save state »

·         Ressources insuffisantes sur le serveur Hyper-V ciblé

·         Temps du déplacement estimé trop important par rapport aux niveaux de services souhaités

 

Etape 2 : Parcourir la liste des machines à déplacer

Comme son nom l’indique, PowerShell est vraiment très puissant, ainsi, la récupération des machines virtuelles de votre liste se résume à quelques lignes.

 

# Récupération du contenu du fichier dans un tableau

$VMList = Get-Content "VMList.txt"

 

$VMList contient alors un tableau dont chaque ligne contient le nom d’une machine virtuelle.

Pour en énumérer le contenu, nous utiliseront la fonction « ForEach » de Powershell.

 

# Enumération du tableau

$VMList |Foreach{$_}

 

Note : La variable spéciale « $_ » représente l’objet en cour passé à travers le « Pipe » pour chaque énumération. Dans notre cas, cet objet est une chaine de texte pour chaque ligne du tableau (le nom de nos machines virtuelles).

En rassemblant les informations de la première partie de cet article, nous avons maintenant tous les éléments nécessaires à la conception de notre script.

 

#Connexion au serveur SCVMM

Get-vmmserver localhost

#Récupération du contenu du fichier VM dans un tableau

$VmCol = Get-content vm.txt

#Enumération du tableau

$VmCol|Foreach{

  $VmName = $_

  #Arrêt de la machine virtuelle en cours d'énumération ($_)

  Shutdown-VM $VmName

  #Création d'un GUID de JOB

  $NewJobGroup = [System.Guid]::NewGuid()

  #Récupération de la ou les cartes réseau de la machine virtuelle

  $VirtualNetworkAdapter = Get-VirtualNetworkAdapter -VMMServer localhost -All | where {$_.name -eq $VmName}

  #Enumération des cartes réseau

  $VirtualNetworkAdapters|Foreach{

    #configuration du réseau cible sous condition du réseau source

    switch ($VirtualNetworkAdapters.VirtualNetWork){

        #Configuration à "Nom_Lan_Cible1" si réseau source égal "Nom réseau 1"

        "Nom réseau 1" {

           Set-VirtualNetworkAdapter -VirtualNetworkAdapter $_ -VirtualNetwork "Nom_Lan_Cible1" -RunAsynchronously -JobGroup $NewJobGroup

         }

        #Configuration à "Nom_Lan_Cible2" si réseau source égal "Nom réseau 2"

        "Nom réseau 2" {

           Set-VirtualNetworkAdapter -VirtualNetworkAdapter $_ -VirtualNetwork "Nom_Lan_Cible2" -RunAsynchronously -JobGroup $NewJobGroup

         }

    }

  }

  #Récupération de l'objet host (serveur Hyper-V cible)

  $VMHost = Get-VMHost -VMMServer localhost |where {$_.Name -eq "Host Cible"}

  #Déplacement de la machine virtuelle sur le CSV Volume1

  Move-VM -VM $VM –VMHost "FQDN du serveur Cible" -Path "C:\ClusterStorage\Volume1" -RunAsynchronously -UseLAN -JobGroup $NewJobGroup

}

 

Mais ce n’est pas tout à fait terminé, il nous manque quelque chose de très important. En effet, la commande de déplacement étant asynchrone, ce script aurait pour effet de provoquer le déplacement simultané de toutes les machines décrites le fichier source, ce qui ne manquerai pas de de saturer le réseau et les disques.

Pour m’assurer que les machines virtuelles sont déplacées une par une, je dois être en mesure de récupérer l’état d’avancement des jobs exécuté par SCVMM. Ceci est réalisable en définissant une variable rattachée à mon job et qui va me permettre d’en récupérer les informations.

Pour cela, il me suffit de rajouter le paramètre « –JobVariable » dans ma commande Move-VM pour définir la variable attachée à mon job en cours (ici nous l’appellerons tout simplement « job »).

 

Move-VM -VM $VM -VMHost $VMHost -Path "C:\ClusterStorage\Volume1" -RunAsynchronously -UseLAN -JobGroup $NewJobGroup -jobvariable "job"

 

Je peux désormais invoquer un objet « $job » représentant le job lancé.

Étant donné que je ne souhaite déplacer mes machines qu’une par une, il me suffit de créer une boucle vérifiant l’état du job avant de procéder à une autre machine.

  While($job.status -eq "Running"){

    Start-Sleep -seconds 5;           

  }

Afin de ne pas trop solliciter le système, je place une temporisation qui aura pour effet d’interroger le statut du job toutes les 5 secondes.

 

La touche du chef…

SCVMM fournis un Cmd-Let (Write-Progress) permettant d’afficher une barre de progression dans votre fenêtre ligne de commande. Cette barre de progression pourra vous informer de l’état d’avancement de votre job. La propriété « CurrentStep » de mon objet Job me renseigne sur l’étape en cours, et la propriété « ProgressValue » sur le pourcentage de complétion.

 

  $JobNameString= $job.CmdletName+ " " +$job.resultname

  While($job.status -eq "Running"){

    Write-progress -activity "$JobNameString" -status $Job.CurrentStep -PercentComplete $Job.progressValue;

    Start-Sleep –seconds 5;      

  }

 

That’s it!

Nous avons maintenant notre script complet, tester le soigneusement et évitez de traiter de trop gros volumes à la fois.

 

###############################################################################

#

#                   Migrate-VM SCVMM Script

#                   V1.0 du 15/06/2010

#

###############################################################################

 

# Ce script est fournit tel quel sans aucune garantie ni support

# Son utilisation relève de votre propre responsabilité

 

#Connexion au serveur SCVMM

Get-vmmserver localhost

 

#Récupération du contenu du fichier VM dans un tableau

$VmCol = Get-content vm.txt

 

#Enumération du tableau

$VmCol|Foreach{

 

  #Création d'un GUID de JOB

  $NewJobGroup = [System.Guid]::NewGuid()

 

  #Récupération de l'objet VM

  $VM = Get-VM -VMMServer localhost -Name "$_"

 

  #Arrêt de la machine virtuelle en cours d'énumération ($_)

  Shutdown-VM $VM

 

  #Récupération de la ou les cartes réseau de la machine virtuelle

  $VirtualNetworkAdapter = Get-VirtualNetworkAdapter -All | where {$_.name -eq $VM.name}

 

  #Enumération des cartes réseau

  $VirtualNetworkAdapters|Foreach{

 

    #configuration du réseau cible sous condition du réseau source

    switch ($VirtualNetworkAdapters.VirtualNetWork){

        #Configuration à "Nom_Lan_Cible1" si réseau source égal "Nom réseau 1"

        "Nom réseau 1" {

           Set-VirtualNetworkAdapter -VirtualNetworkAdapter $_ -VirtualNetwork "Nom_Lan_Cible1" -RunAsynchronously -JobGroup $NewJobGroup

         }

        #Configuration à "Nom_Lan_Cible2" si réseau source égal "Nom réseau 2"

        "Nom réseau 2" {

           Set-VirtualNetworkAdapter -VirtualNetworkAdapter $_ -VirtualNetwork "Nom_Lan_Cible2" -RunAsynchronously -JobGroup $NewJobGroup

         }

    }

  }

 

  #Récupération de l'objet host (serveur Hyper-V cible)

  $VMHost = Get-VMHost | where {$_.Name -eq "Host Cible"}

 

  #Déplacement de la machine virtuelle sur le CSV Volume1

  Move-VM -VM $VM -VMHost $VMHost -Path "C:\ClusterStorage\Volume1" -RunAsynchronously -UseLAN -JobGroup $NewJobGroup -jobvariable "job"

 

  #Formatter l'affichage du nom du Job

  $JobNameString= $job.CmdletName+ " " +$job.resultname

 

  #Vérifier que le job est terminé

  While($job.status -eq "Running"){

    Write-progress -activity "$JobNameString" -status $Job.CurrentStep -PercentComplete $Job.progressValue

    Start-Sleep -seconds 5

  }

  #Un fois que le job est terminé, attendre encore 5 secondes (par sécurité)

  Start-Sleep -seconds 5

 

  #On redémarre la machine virtuelle

  start-vm $vm.name

}

Mise à jour le Jeudi, 19 Mai 2011 10:36
 
Bannière

Joomla! is Free Software released under the GNU/GPL License.