VMware ESXI - Sauvegarde
Sauvegarde de machines virtuelles ESXI sous Windows
ESXi ne comprend pas de fonctionnalités de sauvegarde des machines virtuelles qu’il héberge. Afin de sauvegarder des VMs en fonction sur un serveur de virtualisation sur un serveur de sauvegarde, l’initiative doit venir du serveur de sauvegarde.
Les manipulations décrites ci-après sont donc toutes à effectuer sur (ou depuis) la machine destinée à stocker les backups du serveur de virtualisation.
Téléchargement des ressources nécessaires
La sauvegarde passe par un script perl rédigé par Christian Gruetzner qui exploite les capacités de l’interface de ligne de commande disponibles pour faciliter la gestion d’une machine ESXi.
Afin de permettre le fonctionnement du scipt, il est nécessaire de télécharger et d’installer
VMware Infrastructure Remote CLI :
http://www.vmware.com/downloads/download.do?downloadGroup=VI-RCLI-U2
Le script lui-même est disponible sur internet sous le nom de "ESXi-Backup.pl", le code du script tel qu’il est proposé est disponible au bas de ce document.
Configuration préalable de ESXi
Avant d’attaquer la configuration du script en lui-même, il convient de faire les choses correctement au niveau du serveur ESXi. Cela entend la création d’un utilisateur dédié à la sauvegarde ponctuelle ou régulière des VMs.
On commence donc par se connecter au serveur ESXi via vSphere Client. Il faut ensuite se rendre dans l’onglet "Utilisateurs et groupes locaux", et créer un nouvel utilisateur.
Pour l’exemple, le nom de cet utilisateur sera "backup" et son mot de passe "azerty12345@". Les données relatives à cet utilisateur seront insérées une fois pour toutes dans le script de backup. Autant en profiter pour sécuriser l’accès au maximum.
Pour configurer les droits de cet utilisateur, rendez-vous dans l’onglet "Autorisations". Puis, "Clic Droit > Ajouter autorisation".
Dans la partie gauche, indiquant les utilisateurs concernés, cliquez sur "Ajouter" et sélectionnez l’utilisateur backup créé plus tôt. En l’absence de solution plus subtile, sélectionnez le rôle de l’administrateur en tant que rôle assigné. L’utilisateur aura ainsi tout pouvoir pour accéder aux données, et créer des prises de vues.
Configuration du script
Maintenant que tout est en place, ouvrez votre script ESXi-Backup.pl avec un éditeur de texte type notepad. Les modifications commencent à partir de la ligne 22 et concernent uniquement ce premier bloc d’instructions.
Remplacer la partie "IP-Address:Port" par l’adresse ou l’ip du serveur. Dans notre cas, le serveur a pour IP : 192.168.0.1.
my $password = "pw";
Indiquer le login et le mot de passe de l’utilisateur en charge des sauvegardes. Un utilisateur peut être créé avec un mot de passe vide, mais l’utilisateur responsable des sauvegardes doit en posséder un. On indique donc les identifiants de notre utilisateur backup.
my $password = "azerty12345@";
Cette ligne indique le nom des snapshots créés à l’occasion de la sauvegarde. Elle peut être laissé telle qu’elle ou bien modifiée selon vos préférences.
Attention, le script n’est utilisable que pour un datastore à la fois. Si vous souhaitez en sauvegarder plusieurs, il faut créer un script par datastore.
Notre datastore se nomme datastore1, on insert ce nom entre les crochets [...].
Ce nom est celui des dossiers situés dans le datastore. Certains noms sont tronqués par rapport à celui qui est affiché dans l’interface traditionelle. Il est possible de connaitre le nom exact en y accédant par le biais de l’interface web utilisée pour l’étape précédente.
$VMNames[1] = "Linux Graphique - Ubuntu 10.04 C";
$VMNames[2] = "Windows Client - XP SP3";
Il faut indiquer sur cette ligne le chemin d’accès au dossier d’installation du VMware Infrastructure Remote CLI. Le chemin doit être uniquement composé de "chemins courts", du même type que ceux de l’exemple. Pour connaitre le nom court d’un dossier, placez-vous dans le dossier parent et tapez la commande "dir/X" :
Notre chemin est "C:\Program Files\VMware\VMware VI Remote CLI" et le chemin court est le suivant "C:/PROGRA~1/VMware/VMWARE~2".
Ce dossier doit exister. De plus, des dossiers nommés selon les machines virtuelles doivent exister pour accueillir les backups.
#
#
# ESXi 3.5 Backup Script
#
# Autor: Christian Gruetzner
#
#
#############################################################################
#
#2008-08-22 V 1.0 Basic Script
# Functions: - create snapshots of all local VM's
# - get files from ESX-Datastore to local Store
# - exclude unneccessary files from backup
# - remove all created snapshots
# - actual time in log
#
#############################################################################
my $url = "https://IP-Address:Port/sdk/vimService"; #URL to your ESX Host, default:
my $username = "user"; #Username
my $password = "pw"; #User password
my $snapshotname = "BackupSnap"; #Name of your Snapshot
my $DSPath = "[datastore]"; #Datastore name on ESX Host, example [datastore]
my @VMNames;
$VMNames[0] = "ServerDisplayName"; #Uncomment the next lines if you like to backup more vm's
#$VMNames[1] = "";
#$VMNames[2] = "";
#$VMNames[3] = "";
#$VMNames[4] = "";
#$VMNames[5] = "";
#$VMNames[6] = "";
#$VMNames[7] = "";
#$VMNames[8] = "";
#$VMNames[9] = "";
my $RCLIPath = "C:/Progra~1/VMware/VM9270~1"; #VI Remote CLI Path (Windows: Use ONLY Short Folder Names!!!!)
my $DestPath = "D:/"; #Destination Path you like to copy to (Windows: Use ONLY Short Folder Names!!!!)
#IMPORTANT!!! -- Under DestPath must exist the VMNames Folder
#(For Example if your VMNames[0] = "ServerA" and your DestPath = "D:/": D:/ServerA/)
#--------------------------------------------------------
# For the short folder name use "dir /X"
#call the sub function (at the bottom)
&actualtime();
print " ***** Script Start *************************\n\n";
&actualtime();
print " ----- Create Snapshots of running VM's -----";
print "\n\n";
system("perl $RCLIPath/Perl/apps/vm/snapshotmanager.pl --url $url --username $username --password $password --operation create --powerstatus poweredOn --snapshotname $snapshotname");
print "\n\n";
&actualtime();
print " ----- Copy VM files to local storage -----";
print "\n\n";
my $i = 0;
#special loop for arrays. run as long the array has data
foreach (@VMNames)
{
#read all available files and save filenames in the cache-array
my @cache = `perl $RCLIPath/bin/vifs.pl --url $url --username $username --password $password --dir \"$DSPath $VMNames[$i]\"`;
#run as long the cache array has data and save the value everytime in $filename
foreach my $filename (@cache)
{
#exclude uninterresting files from backup to save backup space
if($filename !~ /.log/ && $filename !~ /.vswp/ && $filename !~ /.vmsn/ && $filename !~ /-delta/)
{
#remove the "\n" at the end of $filename to prevent a error massage in log
chomp($filename)
&actualtime();
print " ----- Copy File: ";
print $filename;
#get files from VM Datastore to a local Storage
system("perl $RCLIPath/bin/vifs.pl --url $url --username $username --password $password --get \"$DSPath $VMNames[$i]/$filename\" \"$DestPath$VMNames[$i]/$filename\"");
print "\n";
}
}
$i++;
}
print "\n\n";
&actualtime();
print " ----- Remove Snapshots of running VM's -----";
print "\n\n";
system("perl $RCLIPath/Perl/apps/vm/snapshotmanager.pl --url $url --username $username --password $password --operation remove --powerstatus poweredOn --snapshotname $snapshotname --children 1");
print "\n\n";
&actualtime();
print " ***** Script End ***************************";
#sub function to print the actual time in the log
sub actualtime
{
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
$Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $CTIME_String = localtime(time);
$Monat+=1;
$Jahrestag+=1;
$Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat;
$Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag;
$Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden;
$Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
$Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden;
$Jahr+=1900;
print "$Jahr-$Monat-$Monatstag $Stunden:$Minuten:$Sekunden";
}