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 :


Télécharger des fichiers à l’aide de BITS (Windows 7 et Windows 10)

Intérêt ?

Vous souhaitez télécharger un gros fichier (plusieurs GB) mais sans surcharger le lien ? Le transfert BITS est fait pour vous (et ce script aussi).

Avantage :

  • Gestion par queue
  • Taux de transfert modifiable
  • Soumis à la QOS
  • Capacité de reprise (si le serveur en face l’accepte)
  • Téléchargement de fichiers / dossiers sous dossier etc
  • Possible téléchargement multiple.

Inconvénient :

  • Pas « user-friendly »

Téléchargement standard :

saturation de la bande passante

Téléchargement BITS :

téléchargement par « pic », ne saturant plus le lien.

Le script :

Dans cette exemple, nous allons télécharger une ISO Ubuntu de quelques giga (voir la variable $source)
Une fois le téléchargement complété, cette ISO sera ensuite stockée dans un répertoire (voir la variable $destination)

Concernant la source, elle peut être :
– Un fichier (dans un répertoire réseau ou sur internet)
– Un répertoire avec des fichiers (dans un répertoire réseau)

Concernant la destination, elle DOIT être :
– Si on récupère un fichier, la destination DOIT être un fichier. Par exemple, si on télécharge un ISO, la destination doit être C:\XXX\XXX\monfichier.iso
– Si on récupère un répertoire/sous répertoire, la destination DOIT être un répertoire.


Les clefs de registre du début sont là pour configurer BITS (débits et mode) Pour le moment, je n’ai pas trouvé d’autres moyens (si quelqu’un à une idée… :p )

Version avec Proxy :

#Configuration de BITS.
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v EnableBITSMaxBandwidth /t REG_DWORD /d 1 /f
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v MaxBandwidthValidFrom /t REG_DWORD /d 8 /f
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v MaxBandwidthValidTo /t REG_DWORD /d 17 /f
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v MaxTransferRateOffSchedule /t REG_DWORD /d 90000 /f #valeur à modifier pour brider (en Kbit/s)
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v MaxTransferRateOnSchedule /t REG_DWORD /d 90000 /f #valeur à modifier pour brider (en Kbit/s)
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v UseSystemMaximum /t REG_DWORD /d 0 /f

#Authentification Proxy
$ProxyCred = Get-Credential -Message "Proxy Auth"
$source = "http://mirrors.phx.ms/ubuntu-cd/18.04.2/ubuntu-18.04.2-desktop-amd64.iso" #exemple : "T:\XXXXX\XXXXX\macon.doc" ou "T:\XXXXX\XXXXX\*.*" pour copier l'ensemble des répertoires/fichiers
$destination = "C:\Tempo\ubuntu.iso" #exemple : "C:\temp\" ou "C:\temp\macon.doc"

Start-BitsTransfer -Source $source -Destination $destination -Priority low -ProxyUsage SystemDefault -ProxyAuthentication basic -ProxyCredential $ProxyCred -TransferType Download

Version sans proxy :

#Configuration de BITS.
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v EnableBITSMaxBandwidth /t REG_DWORD /d 1 /f
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v MaxBandwidthValidFrom /t REG_DWORD /d 8 /f
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v MaxBandwidthValidTo /t REG_DWORD /d 17 /f
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v MaxTransferRateOffSchedule /t REG_DWORD /d 90000 /f #valeur à modifier pour brider (en Kbit/s)
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v MaxTransferRateOnSchedule /t REG_DWORD /d 90000 /f #valeur à modifier pour brider (en Kbit/s)
REG add "HKLM\SOFTWARE\Policies\Microsoft\Windows\BITS" /v UseSystemMaximum /t REG_DWORD /d 0 /f

$source = "http://mirrors.phx.ms/ubuntu-cd/18.04.2/ubuntu-18.04.2-desktop-amd64.iso" #exemple : "T:\XXXXX\XXXXX\macon.doc" ou "T:\XXXXX\XXXXX\*.*" pour copier l'ensemble des répertoires/fichiers
$destination = "C:\Tempo\ubuntu.iso" #exemple : "C:\temp\" ou "C:\temp\macon.doc"

Start-BitsTransfer -Source $source -Destination $destination -Priority low -TransferType Download

Lancement du script :

Vous devez être administrateur du PC pour pouvoir lancer le script.
Pensez aussi à faire un :

Set-ExecutionPolicy Unrestricted

… pour autoriser l’exécution des scripts.

Lors que vous lancerez le script, le téléchargement se lancera automatiquement, une « barre » de progression s’affichera aussi :