Créer des VM en MASSE via script !!

Avant propos :

Ce script est « fait maison » et avec le cœur. Oui, il n’est pas parfait et oui, il y a surement des optimisations à faire, mais il fonctionne et surtout j’y ai passé du temps dessus…
Je suis ouvert à toute proposition d’amélioration, dans le respect bien-sur ! sinon allez vous faire … 🙂

Version :
V1 – Diffusion 10/04/2019

Prérequis :

  • PowerCLI sur le serveur ou PC allant lancer le script
  • Un compte ayant les droits de création de machine virtuelle
  • Un profil de machine virtuelle (vous savez, le « truc » que personne n’utilise dans le vCenter nommé « Gestionnaire de spécification de personnalisation » )
  • Un Template parfait (voir mon autre article « Comment créer une machine virtuelle)

Que va faire le script ?

  1. Se connecter au vCenter
  2. Chercher si les machines virtuelles existent déjà
  3. Créer X machines virtuelles via un template et un profil de VM sur un host aléatoire en fonction du nombre de Host disponible (mention spéciale aux personnes n’ayant pas le DRS de configuré :p )
  4. Vous informer de l’avancement des tâches de création
  5. Les démarrer après création afin que le profil de VM s’applique.

J’insiste sur le fait que le Profil de VM doit être créé et configuré. C’est simple à faire depuis le vCenter, et c’est un gain de temps considérable pour la configuration des machines virtuelles après création.

Pour rappel : le Profil de VM permet de configurer la machine virtuelle dès le premier démarrage de celle-ci. On peut configurer le hostname, la licence, la configuration réseau, joindre la VM au domaine etc ….. !

Le Script :

j’ai commenté suffisamment le script pour qu’il soit facile à lire et modifier. Dans cette exemple ci dessous, je l’applique à un environnement VDI (ce qui explique le nom des VM) mais cela fonctionne aussi dans un environnement standard…)

Les variables :

Les variables à modifier OBLIGATOIREMENT sont :


$vcenterXBI ##le nom d'hôte ou IP du VCENTER
$datastoreXBI ##Variable pour le Datastore de destination de l'ensemble des futurs VMs
$nbreHoteXBI ##Nombre d'hote ESX dans le cluster
$modeleXBI ##Le modèle de base (template obligatoire)
$poolVMXBI ##Nom du pool de ressource, pas obligatoire, vous pouvez supprimer si jamais
$personnalisationXBI ##Fichier de personnalisation créé depuis le vcenter (vous savez le fameux "Gestionnaire de spécification de personnalisation"
$nomVMXBI ##Nom des futurs VM, le {0} corresponds au numéro, exemple "maison{0}" va créer maison1, maison2 etc...

Le script complet :


Clear
Add-PSSnapIn VMware.VimAutomation.Core  #powercli
####### VARIABLES #######
$vcenterXBI = "nom du vcenter"                               ##le nom d'hôte ou IP du VCENTER
$userXBI = Read-Host -Prompt "Nom d'utilisateur"             ##Prompt pour l'utilisateur
$passwordXBI = Read-Host -Prompt "mot de passe"              ##Prompt pour le mot de passe
$datastoreXBI = "vsanDatastore"                              ##Variable pour le Datastore de destination de l'ensemble des futurs VMs
$nbreHoteXBI = "4"                                           ##Nombre d'hote ESX dans le cluster
$modeleXBI = "VDI-2k12-GOLD"                                  ##Le modèle de base (template)
$nombreVMXBI = Read-Host -Prompt "Nombre de VM à cloner ?"   ##Prompt pour le nombre de VM à créer
$poolVMXBI = "VDI-2K12"                                        ##Nom du pool de ressource, pas obligatoire, vous pouvez supprimer si jamais
$personnalisationXBI = 'Windows2k8-VDI'                      ##Fichier de personnalisation créé depuis le vcenter
$nomVMXBI = "VDI-TEST-{0}"                                   ##Nom des futurs VM, le {0} corresponds au numéro, exemple "maison{0}" va créer maison1, maison2 etc...  
###### FIN DES VARIABLES #######

Connect-VIServer -Server $vcenterXBI -User $userXBI -Password $passwordXBI
$spec = Get-OSCustomizationSpec -Name $personnalisationXBI

function creation {
    1..$nombreVMXBI | foreach{
        $vmNom = $nomVMXBI -f $_
        $vm = Get-VM -Name $vmNom
            if ($vm) {
                "{0} exists" -f $vmNom
                Write-Host "Machines existent déjà" -ForegroundColor Red
                exit
                Disconnect-VIServer -Confirm:$false
                     }
            else {
                $numHost = get-random -Maximum $nbreHoteXBI         ##genere un nombre         
                $esx = (Get-VMHost)[$numHost]                    ##selectionnne un hote en fonction du nombre au dessus
                $esx | New-VM -Name $vmNom -Template $modeleXBI -Datastore $datastoreXBI -OSCustomizationSpec $spec -ResourcePool $poolVMXBI -RunASync
                 }
}
}
Clear
function log {
              Do {
              Clear
              Get-Task | Where-Object { $_.name -eq "CloneVM_Task" -and $_.State -eq "Running"} | Format-Table
              sleep 10
              Clear
}
              until ((Get-Task | Where-Object { $_.name -eq "CloneVM_Task" -and $_.State -eq "Running"}) -eq $Null)}

function StartdesVM {
    1..$nombreVMXBI | foreach{
                          $vmNom = $nomVMXBI -f $_ 
                          Start-VM -VM $vmNom
                          sleep 3
                          }
}

creation #fonction de creation des VM
log #fonction de log interractif
StartdesVM #demarrage des VM

Write-Host "Machines virtuelles crées et démarrées, merci de patienter le temps que le profil de VM s'applique !" -ForegroundColor Yellow
Disconnect-VIServer -Confirm:$false

Résultat :

J’ai lancé la création de trois machines virtuelles :

Pendant la création des VM :

A la fin de l’exécution du script :

Sur mon pool de ressource dans le vCenter :


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *