Reporte de Snapshots de VMs en VMware

En oportunidades anteriores se ha hablado sobre la proyección de PowerShell fuera del mundo Microsoft, en donde empresas externas han desarrollado extensiones para utilizarse desde PowerShell. Una de ellas es VMware, en donde ha crecido de manera exponencial el uso de PowerShell para realizar la administración de la plataforma. Es en este post que se pretende mostrar como podemos resolver una situación en la que necesitamos un reporte de snapshots de VMs en VMware con PowerShell.

La consola de PowerShell para VMware

Dentro del mundo VMware se conoce popularmente la consola de administración por scripting como PowerCLI. Desde nuestra querida consola de PowerShell es posible trabajar con la plataforma de VMware realizando una simple acción: cargando el pssnappin que VMware nos deja a disposición.

Hay que aclarar que para contar con este pssnappin, es necesario descargar el PowerCLI desde la página de VMware y realizar la instalación correspondiente, utilizando éste enlace.

Ya con la instalación realizada basta con ejecutar en la consola de PowerShell:

Add-PSSnapin VMware.VimAutomation.Core

Podemos escribir un poco más de código y comprobar si se encuentra cargado desde el inicio y, a su vez, comprobar que se encuentre instalado:

If (-not (Get-PSSnapin VMware.VimAutomation.Core))
{  Try { Add-PSSnapin VMware.VimAutomation.Core -ErrorAction Stop }
   Catch { Write-Host "PowerCLI no se puede agregar, está instalado?" -ForegroundColor Red; Break }
}

Ahora que sabemos si cumplimos el requisito para utilizar los comandos que dispone VMware, debemos definir el servidor al que pretendemos conectarnos y con qué credenciales vamos a realizar la conexión, utilizando el siguiente comando:

$VIServer = "<serverName>"
Connect-VIServer $VIServer 

A continuación, vamos a utilizar el siguiente fragmento de código. En el mismo, lo primero que accionamos es la obtención de las máquinas virtuales del servidor y de cada una de ellas si tiene spanshot o no. De lo anterior filtramos seleccionando los datos que realmente nos interesan para el reporte (también se manipula el tamaño, para que sea representado con un formato amigable). Luego vamos a exportarlo como .html:

$PathToReport = "C:\"
$Report = Get-VM | Get-Snapshot | Select VM,Name,Description,@{Label="Size";Expression={"{0:N2} GB" -f ($_.SizeGB)}},Created
If (-not $Report)
{  $Report = New-Object PSObject -Property @{
        VM = "No se encontraron snapshots en ninguna de las VMs del $VIServer"
        Name = ""
        Description = ""
        Size = ""
        Created = ""
    }
}

$Header = @"
<style>
TABLE {border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}
TH {border-width: 1px;padding: 3px;border-style: solid;border-color: black;background-color: #3A539B;color: white;}
TD {border-width: 1px;padding: 3px;border-style: solid;border-color: black;}
</style>
"@

$MyObject | Select 'Folder Name',Owner,'Created On','Last Updated',Size | ConvertTo-HTML -Head $Header

$Report = $Report | Select VM,Name,Description,Size,Created | ConvertTo-Html -Head $Header -PreContent "<p><h2 style='font-family: Segoe UI Light,Arial;'>Reporte de Snapshots - $VIServer</h2></p><br>"
$Report | Out-File $PathToReport\SnapShotReport.html

Logrando un resultado como el siguiente:

Reporte de Snapshots de VMs en VMware

Ahora que tenemos el archivo .html, resta agregar la función Send-MailMessage. Con ella se enviará el reporte de snapshots de VMs en VMware a las personas interesadas. Un ejemplo de uso de la función sería:

Send-MailMessage -From "User01 <user01@example.com>" -to "User02 <user02@example.com>" -Subject "Reporte de Snapshots" -Body "Se adjunta el reporte de snapshots de VMware." -Attachments "SnapShotReport.html" -SmtpServer smtp.server.com

Y de esta manera, tenemos al final un reporte funcional con la información requerida de los Snapshots de nuestra plataforma de VMware utilizando la consola de PowerShell de forma simple.

Saludos,

Comments