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" } }