Skip to content
Luca Dell'Oca Principal Cloud Architect @Veeam
Virtual To The Core Virtual To The Core

Virtualization blog, the italian way.

  • Media
  • About me
Virtual To The Core
Virtual To The Core

Virtualization blog, the italian way.

Sto facendo il backup di tutte le mie VM?

Luca Dell'Oca, July 23, 2012December 4, 2016

Nota: ho ideato inizialmente un sistema di controllo che troverete ancora nei forum di Veeam, ma in seguito a molte discussioni sul forum la versione che troverete qui si discosta molto dal codice originario, migliorandolo decisamente. Il merito principale del codice Powershell va a Tom Sightler e in parte Seth Bartlett, si vi è servito lo script dite grazie a loro.

 

Ci sono situazioni dove la risposta a questa domanda può non essere sempre un SI convinto. Magari gestite centinaia o migliaia di VM, oppure avete un ambiente dove la loro creazione e distruzione è frequente, oppure sono presenti vari amministratori che gestiscono l’ambiente virtualizzato.
Tutte queste situazioni possono portare a cambiamenti nella lista di VM presenti, e se queste non vengono riportare fedelmente nei job di backup si rischia di dimenticarsene qualcuna… e soprattutto accorgersene solo quando si deve fare un restore e non si ha un backup di quella VM!

Per ovviare a questo problema, esiste un metodo preventivo e un sistema di controllo, entrambi realizzabili con Veeam Backup.

 

Usare i container invece delle liste di VM

Nei job di Veeam Backup è possibile impostare manualmente le singole VM che vogliamo  salvare. Quando una nuova VM viene quindi aggiunta all’infrastruttura VMware è quindi obbligatorio aggiungerla anche al job di backup già esistente.
E’ possibile tuttavia semplificare questo aspetto usando i container: se ad esempio selezioniamo come sorgente un resource pool, un datastore o addirittura l’intero vCenter,  a questo punto la lista di VM viene creata dinamicamente ad ogni esecuzione del backup estraendola direttamente da vCenter stesso. In ambienti vCloud ad esempio il resource pool è un ottimo elemento di partenza, dato che corrisponde al singolo tenant e possiamo quindi avere un job di backup per ogni cliente ospitato.

 

Script di controllo

Ci sono tuttavia alcune eccezioni in cui anche questo sistema mostra dei limiti. Ad esempio se aggiungiamo un nuovo resource pool (manualmente o tramite la creazione di un nuovo tenant di vCloud) o un nuovo datastore, questo non è registrato in nessun job preesistente. Altro esempio è l’esclusione puntuale di una singola VM da un job di backup, magari perchè inizialmente non volevamo farne il backup ma in seguito è sorta questa necessità (siamo pieni di VM che erano solo di test e magicamente diventano produttive)

Per ovviare a questi problemi, può essere utile eseguire uno script Powershell per controllare lo stato dei backup. In questo senso, Veeam ha fatto una lodevole scelta nel supportare pienamente Powershell per tutti i suoi comandi.

Lo script in questione deve essere eseguito sul Veeam Server, dove avremo avuto l’accortezza di scegliere l’opzione Powershell durante l’installazione. Dovrete configurare il parametro $vcenter impostando l’hostname o l’indirizzo IP del vCenter server, ed eseguire lo script con un’utenza amministrativa del Veeam Server; per accedere a vCenter lo script utilizzerà le credenziali già impostate per registrare vCenter stesso all’interno di Veeam Backup.

Lo script preleva da vCenter l’elenco completo delle VM presenti, e per ognuna verifica se ne è stato fatto un backup (che abbia risultato Success o Warning) nelle ultime 24 ore. E’ possibile variare questo periodo modificando la stringa (Get-Date).addhours(-24) e modificando il valore 24 (corrispondente alle ore).

Una volta eseguito, il risultato a video sarà simile a questo:

Come potete vedere, lo script colora in verde le VM protette, e in rosso quelle non salvate nelle ultime 24 ore. In questo modo è comodissimo verificare quali VM sono non protette, e correggere velocemente la situazione. Variando il parametro da 24 ad un altro valore, è possible scegliere periodi temporali maggiori. In questo esempio ho portato il valore a 48, andando a evidenziare alcune VM delle quali avevo fatto il backup il giorno precedente, ma non nelle ultime 24 ore (qui sono colorate in verde rispetto al rosso precedente):

Nella variabile iniziale $excludevms è possibile indicare, separate da virgola, quelle VM che non vogliamo vengano controllate, magari perchè sono VM di cui non ci interessa farne un backup.

Ecco lo script completo:

asnp "VeeamPSSnapIn" -ErrorAction SilentlyContinue

####################################################################
# Configuration
# vCenter server
$vcenter = "vcenter_ip"
# To Exclude VMs from report add VM names to be excluded as follows
# $excludevms=@("vm1","vm2")
$excludevms=@()
####################################################################

$vcenterobj = Get-VBRServer -Name $vcenter
$vmobjs = Find-VBRObject -Server $vcenterobj | Where-Object {$_.Type -eq "VirtualMachine"}
$jobobjids = [Veeam.Backup.Core.CHierarchyObj]::GetObjectsOnHost($vcenterobj.id) | Where-Object {$_.GetItem().Type -eq "Vm"}

# Convert exclusion list to simple regular expression
$excludevms_regex = (‘(?i)^(‘ + (($excludevms |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’) -replace "\\\*", ".*"

foreach ($vm in $vmobjs) {
    $jobobjid = ($jobobjids | Where-Object {$_.ObjectId -eq $vm.Id}).Id
    if (!$jobobjid) {
        $jobobjid = $vm.FindParent("Datacenter").Id + "\" + $vm.Id
    }
    $vm | Add-Member -MemberType NoteProperty "JobObjId" -Value $jobobjid
}    

# Get a list of all VMs from vCenter and add to hash table, assume Unprotected
$vms=@{}
foreach ($vm in ($vmobjs | where {$_.Name -notmatch $excludevms_regex}))  {
	if(!$vms.ContainsKey($vm.JobObjId)) {
		$vms.Add($vm.JobObjId, @("!", [string]$vm.GetParent("Datacenter"), $vm.Name))
    }
}

# Find all backup job sessions that have ended in the last 24 hours
$vbrjobs = Get-VBRJob | Where-Object {$_.JobType -eq "Backup"}
$vbrsessions = Get-VBRBackupSession | Where-Object {$_.JobType -eq "Backup" -and $_.EndTime -ge (Get-Date).addhours(-24)}

# Find all successfully backed up VMs in selected sessions (i.e. VMs not ending in failure) and update status to "Protected"
foreach ($session in $vbrsessions) {
    foreach ($vm in ($session.gettasksessions() | Where-Object {$_.Status -ne "Failed"} | ForEach-Object { $_ })) {
        if($vms.ContainsKey($vm.Info.ObjectId)) {
            $vms[$vm.Info.ObjectId][0]=$session.JobName
        }
    }
}

$vms = $vms.GetEnumerator() | Sort-Object Value

# Output VMs in color coded format based on status.
foreach ($vm in $vms)
{
  if ($vm.Value[0] -ne "!") {
      write-host -foregroundcolor green (($vm.Value[1]) + "\" + ($vm.Value[2])) "is backed up in job:" $vm.Value[0]
  } else {
      write-host -foregroundcolor red (($vm.Value[1]) + "\" + ($vm.Value[2])) "is not found in any backup session in the last 24 hours"
  }
}

 

 

Share this:

  • Click to share on X (Opens in new window) X
  • Click to share on Facebook (Opens in new window) Facebook
  • Click to share on LinkedIn (Opens in new window) LinkedIn
  • Click to email a link to a friend (Opens in new window) Email
  • Click to share on Tumblr (Opens in new window) Tumblr
  • Click to share on Pinterest (Opens in new window) Pinterest
  • Click to share on Reddit (Opens in new window) Reddit
  • Click to share on WhatsApp (Opens in new window) WhatsApp
  • Click to share on Pocket (Opens in new window) Pocket
Tecnologia backupcheckpowershellstatusveeam

Post navigation

Previous post
Next post

Search

Sponsors

Latest Posts

  • Migrate WSL (Windows Subsystem for Linux) to a new computer
  • Pass keystrokes to a pfSense virtual machine to install it automatically
  • Automatically deploy pfSense with Terraform and Ansible
  • My Automated Lab project: #6 Create a S3 Bucket with Terraform
  • My Automated Lab project: #5 Deploy a Linux vSphere VM with Terraform and custom disks
©2025 Virtual To The Core | WordPress Theme by SuperbThemes
We use cookies to ensure that we give you the best experience on our website, and to collect anonymous data regarding navigations stats using 3rd party plugins; they all adhere to the EU Privacy Laws. If you continue to use this site we will assume that you are ok with it.OkNoPrivacy Policy