Les scripts Powershell indispensables à votre veeam backup
Posted by NiTRo | Filed under Tips & Tricks, VMware, veeam
MAJ 13/07/2012 : Mise à jour du script de récupération des fichiers de backup orphelins pour la v6, merci à Thierry pour le feedback.
Nous vous proposions il y a quelques temps un script qui stop les jobs en cours sur un serveur veeam backup, aujourd’hui nous allons plus loin dans la démarche avec 2 fichiers xml correspondant à 2 export de tache planifiée pour Windows 2008 R2 contenant les commandes. Le fichier StopActiveVBRJobs.xml va vous permettre de créer une tache planifiée qui arrêtera les jobs veeam en cours à 7h du matin, les jours de semaine, et le fichier RetryFailedVBRJobs.xml automatisera le retry des jobs arrêtés ”manuellement” à 21h, les mêmes jours.
Nous vous proposons également une tache planifiée qui automatise l’export des jobs veeam backup sur un partage CIFS (\\server\share\ à ajuster) et un autre qui permet d’exporter régulièrement (en xml) la liste des points de restauration possibles pour chaque vm de chaque job.
Voici maintenant un oneliner pour un usage très particulier, celui de trouver (replacez le get-item par remove-item pour supprimer) les fichiers veeam backup orphelins dans les répertoires cibles des jobs (cela peut arriver en cas de reboot violent du serveur veeam ou indisponibilité du repository pendant un backup).
v5 :
Compare-Object (Get-VBRJob|%{$_.Info.TargetDir|%{Get-ChildItem $_|%{$_.FullName}}}) (Get-VBRBackup|%{$_.GetStorages()|%{$_.FilePath}})|%{Get-Item $_.InputObject}
v6 :
Compare-Object (Get-VBRJob|%{$_.Info|%{Get-ChildItem "$($_.TargetDir)\$($_.Path)"|%{$_.FullName|?{$_ -match ".vrb|.vbk|.vib"}}}}) (Get-VBRBackup|%{$_.GetStorages()|%{$_.FilePath}})|%{Get-Item $_.InputObject}
On continue avec un autre oneliner qui permet d’afficher la liste des vm dont la date du dernier backup veeam (si vous avez activé la fonction qui rempli l’un des custom fields, “veeam” dans notre exemple) est supérieure à 21 jours, que vous pouvez utiliser dans un script pour vous envoyez un mail périodiquement par exemple.
Get-View -Viewtype virtualmachine|select name,@{n="backup";e={[Regex]::Match(($_.value|?{$_.key -eq ((get-view (Get-View ServiceINstance).content.CustomFieldsManager).field|?{$_.name -match "veeam"}).key}).value, "([0-9]{1,2}/){2,2}201[0-9]{1,1}[ ]*([0-9]{1,2}:?){3,3}").Value}},@{n="pool";e={(get-view $_.ResourcePool).name}}|?{$_.backup}|?{([datetime]::ParseExact(($_.backup), "dd/MM/yyyy HH:mm:ss", (New-Object System.Globalization.CultureInfo("fr-FR")))) -le (get-date).AddDays(-21)}
Et pour finir, un oneliner qui nous a prit un peu de temps (à cause du comportement bizarre du -ExpandProperty de la cmdlet Select-Object) qui vous permet de lister les vm présentent dans plusieurs jobs de backup.
Get-VBRBackup|select jobname,@{n="vm";e={$_.GetObjectOibsAll()|%{@($_.name,"")}}}|select jobname -ExpandProperty vm|select @{n="vmname";e={$_}}, @{n="jobname";e={$_.jobname}}|?{$_.vmname}|Group-Object -Property vmname|?{$_.Count -gt 1}|select name, @{n="jobs";e={$_.group|%{$_.JobName}}}
Tags: oneliner, powershell, scripting
July 12th, 2012 at 10:43
Le premier oneliner me donne de mauvais résultat sous VBR 6.1
Mais celui-ci semble convenir ?
Compare-Object (Get-VBRBackup|%{$_.Info.DirPath}|%Get-ChildItem $_|%{$_.FullName}}|?{$_ -match “vib|vbk”} ) (Get-VBRBackup|%{$_.GetStorages()|%{$_.FilePath}})|%{Get-Item $_.InputObject}
July 13th, 2012 at 16:55
Non ce n’est pas tout à fait bon car ça ne va comparer que les répertoires des jobs hors des backups importés n’ont pas de job associé et il peux y avoir des fichiers orphelins dans les répertoires aussi. J’ai ajouter l’équivalent pour la v6, dites moi si ça vous donne un bon résultat.
Merci pour votre feedback.
July 17th, 2012 at 8:23
Pour le script v6:
En fait j’ai un job qui ne se sauvegarde pas dans un dossier du même nom (reprise d’anciennes backups?)
Job: WINDOWS-DATABASE-DAILY
Chemin de backup : H:\Backups\WINDOWS-DATABASE
Ce qui donne:
Get-ChildItem : Cannot find path ‘H:\Backups\WINDOWS-DATABASE-DAILY’ because it does not exist.
July 18th, 2012 at 22:48
Je craignais ce cas justement, je vais voir comment contourner le problème sans perdre en fonctionnalité ni sacrifier le oneliner
Merci encore pour votre feedback Thierry.