Cerca nel blog

domenica 19 dicembre 2010

Snapshot Report Scripting

VI presento un articolo di Enzo che può servire a molti e quindi lo publico :-). Sivix.

Questo e' uno script utile e veloce per ottenere un report delle snapshot presenti in una farm. Una piccola considerazione è però necessaria, spesso le cmdlet PowerShell \ PowerCLI sono “bistrattate” J e spesso ci si limita ad un rapido Cut&Paste senza sapere cosa lo script fa in realtà; in questo articolo invece prendiamo lo script e lo “analizziamo”per capire come “ragiona”.

Lo script è stato semplificato e reso nella forma più sintetica, fornendo comunque tutte le informazioni desiderate:

$VC = Connect-VIServer -Server "VCServer" -User "username" -Password "password"
   foreach ( $Snapshot in Get-VM | Get-Snapshot )
{
If ($Snapshot.ID -like "VirtualMachineSnapshot-*")
  {
   $Report = "" | Select-Object VM_Name,Snapshot_Name,Snapshot_SizeMB,Snapshot_Description,snapshot_Creation,
‘HDSIZE,nHD,ESX,HDname

       $Report.VM_Name=$Snapshot.VM
       $Report.Snapshot_Name=$Snapshot.Name
       $Report.Snapshot_SizeMB=[Math]::Round($Snapshot.SizeMB - $Snapshot.VM.HardDisks[0].CapacityKB/1024)
       $Report.Snapshot_Description=$Snapshot.Description
       $Report.snapshot_Creation=$Snapshot.Created
       $Report.HDSIZE=[Math]::Round ($Snapshot.VM.HardDisks[0].CapacityKB/1024)
       $Report.HDName=$Snapshot.VM.HardDisks[0].Filename
       $Report.nHD=($Snapshot.VM.HardDisks).count
       $Report.ESX=$Snapshot.VM.Host.Name
Write-Output $Report
} #chiusura dell’IF
}#Chiusura del Foreach


iniziamo l’analisi …. Prerequisiti …. Connessione alla Farm Vmware ☺. 
Definiamo il VC e i parametri di autenticazione. 

#Stringa di connessione
$VC = Connect-VIServer -Server "VCServer" -User "username" -Password "pass"

L’intero script si basa su una query, che a parole potrebbe esprimersi cosi:
per ogni VM (“Get-VM”) presente nella farm, verificare se ha delle snapshot(“Get-Snapshot”).

Identificate e memorizzate le snapshot, siamo in grado di creare un report. Però prima dobbiamo fare un opera di filtraggio, infatti il comando precedente ci dà lo stato delle snapshot di ogni VM, ma a noi interessano solo le snapshot vere e non quelle potenziali.
If ($Snapshot.ID -like "VirtualMachineSnapshot-*")
{
….}
Dalle informazioni in nostro possesso dobbiamo circoscrivere cosa ci interessa includere nel report:
In genere le informazioni rilevanti sono:
Nome della VM
Nome dato alla Snapshot
Dimensioni dello snapshot
Descrizione dello snapshot,
Data e ora della creazione
Nome del vHD e path (incluso il datastore) dove la snapshot è presente.
Dimensioni del HD
In quale ESX la VM è associata. 

Una interessante notizia, queste informazioni (insieme ad una miriade di altre) sono già incluse nella variabile $Snapshot.
Per visualizzarle basta usare l’operatore “.”.
Per dare una panoramica delle informazioni disponibili con il cmdlet “Get-snapshot” si considerino le due immagini sottostanti.


La prima visualizza la ramificazione principale. Sottolineo principale infatti sulla figura 2 si può intravedere la quantità di informazioni che posso essere visualizzate con la sola espansione della voce “VM”. (Si pensi alla mole di dati disponibili se si espandessero tutte le possibili ramificazioni!).

Un chiarimento meritano i seguenti comandi:

 “=$Snapshot.VM.HardDisks[0].”

In questo caso gli harddisk sono registrati in formato array, il numero all’interno della parentesi quadra definisce quale elemento considerare, nel nostro caso si indica il primo HD (quello di system).

“($Snapshot.VM.HardDisks).count”

In questo caso l’operatore “.count” esegue un operazione sull’array indicando quanti elementi lo compongono , nel nostro caso quanti HD sono associati alla VM.

“($Snapshot.SizeMB –($Snapshot.VM.HardDisks[0].CapacityKB/1024))”

Per capire questo comando bisogna sapere che .SizeMB è il valore aggregato delle dimensioni del file associato all’ HD e del file di snapshot. Per ottenere il valore reale dello spazio usato dallo snapshot va quindi eseguita la sottrazione.

“[Math]::Round(…)” 

Il comando utilizza le librerie matematiche “[Math]” native del powershell, con l’operatore “::Round” approssima al numero intero più vicino.

Infine la divisione che spunta spesso (/1024) ha il solo scopo di trasformare tutti i valori di spazio su disco alla stessa unita di misura ( MB ).

Una volta raccolte le informazioni della singola snapshot e inserite nella variabile $Report non ci resta che renderle visibili a schermo tramite “Write-Output” e …. riprendere il ciclo foreach finché le snapshot non siano state contemplate tutte.

Buon divertimento,
Enzo.

Nessun commento: