La sauvegarde est la base de tout système informatique qui veut perdurer. C'est un point important, pour ne pas dire vital, qui n'a de vrai sens que le jour où l'on rencontre une difficulté. Et pour autant, le temps et l'extension du système d'information faisant, il peut devenir particulièrement compliqué de s'y retrouver dans ce qui est sauvegardé, dans quels jobs, et la volumétrie que cela représente.
En effet, lorsque nous parlons de centaines, voir de miliers de serveurs, chacun étant potentiellement part d'un groupe de machines à sauvegarder également, on peut se retrouver avec des VM sauvegardées plusieurs fois, dans des jobs différents, ce qui démultiplie la volumétrie de manière inutile. Et même si Veeam est un excellent outil pour la sauvegarde, la recherche d'informations telles que la volumétrie totale d'un serveur X peut être extrêmement fastidieuse à retrouver, tout comme la localisation de l'ensemble des backups qui incluent ce serveur X.
Veeam inclut un snappin qui permet de récupérer un nombre de commandes assez conséquent, qui ouvre la porte à l'automatisation et à l'obtention d'informations difficilement obtenables via la GUI. Le script que je vais vous présenter a été développé avec le besoin de faire une refacturation interne aux différents services des ressources consommées, dont le backup fait partie, mais a été aussi utilisé pour trouver les machines sauvegardées plusieurs fois dans des jobs différents, afin d'économiser du temps de sauvegarde et récuperer un peu de ce précieux stockage. Ce script a besoin d'être lancé sur le serveur où Veeam est placé pour qu'il fonctionne.
Vous pouvez télécharger ce script sur mon espace git personnel.
Function Get-VMBackupsizes
{
#ajout du Snappin veeam
try {
Add-PSSnapin VeeamPSSnapin -ErrorAction Stop
}
catch {
exit 10
}
#récupération des backups
$backups = Get-VBRBackup
#récupération des jobs
$jobs = Get-VBRJob
#création d'un tableau
$array = New-Object System.collections.arraylist
#pour chaque backup dans la liste des backups
foreach ($backup in $backups)
{
#si le job avec le même ID possède une planification...
if ($($jobs | Where-Object {$_.id -eq $backup.JobId}).isScheduleEnabled -eq $true)
{
#définition d'une variable à "oui"
$isScheduled = "Oui"
}
else
{
#sinon à $false
$isScheduled = "Non"
}
#Recherche du job dont l'id est le même que l'id de job dans le backup en cours
$thisjob = $jobs | Where-Object {$_.id -eq $backup.info.jobid}
if ($thisjob -ne $null)
{
#Recherche des objets dans le job en question
$jobobject = Get-VBRJobObject $thisjob
}
else
{
$jobobject = $null
}
#Recherche des Objects In Backup et selection de vmname, calcul de la taille et des infos
$thisbackup = $backup.getlastoibs() | Select-Object -Property vmname,@{Name = "Size_calc"; Expression = {[math]::Round($($_.approxsize / 1024 / 1024 / 1024),2)}},info | sort -Property vmname
#pour chaque Object in Backup
foreach ($entry in $thisbackup)
{
#Recherche des objets dans le job en cours dont l'objectid est le même que l'id de l'Object in Backup actuel
$thisjobobject = $jobobject | Where-Object {$_.info.objectid -eq $entry.info.objectid}
#si ce jobobject n'est pas exclus
if(!$thisjobobject.isexcluded)
{
$null = $array.add([pscustomobject]@{
"VM" = $entry.vmName
"Active" = $isScheduled
"Job" = $backup.Name
"JobPath" = $backup.DirPath.ToString()
"JobRepository" = $backup.GetRepositoryName()
"Size" = $entry.size_calc
"LastPointCreation" = $backup.LastPointCreationTime
})
}
}
}
$array = $array | Sort-Object -Property Job,vm
return $array
}
Une fois le script lancé, vous verrez que rien ne se passe. Normal, c'est une fonction, qu'il faut ensuite appeler. Vous pouvez l'enregistrer de cette manière afin de traiter les informations plus tard.
$backups = Get-VMBackupsizes
Et lorsque vous appelerez votre variable, vous pourrez filtrer selon le nom de la VM que vous cherchez et vous pourrez trouver les différents jobs qui l'ont sauvegardée, ainsi que la volumétrie et la date du point de sauvegarde.
Ensuite, à vous de jouer pour la suite :)