Reporte Snapshots

En los últimos días me ha tocado apoyar en un par de casos de “monster Snapshots”, en un caso en particular el disco del snapshot consumió la totalidad del datastore y la máquina virtual no podía encender, afortunadamente la máquina virtual estaba configurada con 24GB de RAM por lo que bastó reservarle toda su memoria para liberar espacio suficiente y así se pudo encender la VM. Tuvimos suerte.

¿Pero que es un Snapshot?
Understanding virtual machine snapshots in VMware ESXi and ESX (1015180)

En corto, un snapshot es un disco “delta” que se crea cuando deseamos mantener un punto de restauración de una máquina virtual, NO ES BACKUP. Mientras exista dicho archivo “delta” todas las operaciones de I/O que tenga la VM se van a redirigir hacia el delta, dejando el disco original VMDK en un estado de “solo lectura”. Dicho archivo VMDK “delta” puede crecer hasta el tamaño provisionado de la VMDK original. He ahí la importancia de mantener los snapshot a raya.

La teoría dice que los snapshot deben de durar abiertos la menor cantidad de tiempo, sin embargo muchas veces se olvidan, o lo que he visto mas comunmente, las herramientas de respaldo dejan snapshots sin cerrar y si no los estamos monitoreando pueden tener graves consecuencias para nuestras VMs.

Hay mucha información en línea y vmware ha publicando documentación al respecto, sin embargo, sigue siendo muy común los casos de problemas con los mismos. No es la intención hacer un post de la teoría, mas bien quiero compartir un script de PowerCLI que hice para reportar snapshots abiertos, tamaño y cuanto tiempo llevan creados, con la idea de no tener que llegar al punto donde ya tenemos el problema encima.

Primero, el KB de mejores prácticas:

Best practices for virtual machine snapshots in the VMware environment (1025279)

Script:

$VMs = Get-Cluster -Name $MiCluster | Get-VM
foreach ($VM in $VMs) {
Get-Snapshot -VM $VM |FT VM,
@{Name="Tamaño GB";Expression={"{0:N1}" -f $_.SizeGB};a="center"},
@{Name="Fecha";Expression={"{0:dd-MMM-yyyy}" -f $_.Created};a="center"},
@{Name="Dias";Expression={"{0:N0}" -f ((get-date) - $_.Created).days};a="center"}, 
@{Name="Descripcion";Expression={$_.Description};a="left"} -a
}

Así se ve la salida del script y aprovecho para compartirles un ejemplo.

vm_1

Lo hice para que me arrojara la información de un cluster, pero puede ser editado para que arroje información de las VMs de todo el vCenter, Datacenter, Folder, Resource Pool, vApp, etc.. Con Task Scheduler se puede programar y que nos llegue el reporte por correo.

Es un pequeño script pero puede darnos información muy valiosa que nos puede ayudar a monitorear y así poder tomar medidas antes de que tengamos datastores completamente llenos o, en el peor de los casos, corrupción de discos de máquinas virtuales.

Espero les sea de utilidad.

spotify:track:07YhAU4StAFzsWv2gMCCPb

Agrega en automático una nueva VM a un Job de Respaldo de Veeam

En este post mostraré una opción para agregar de forma automática una máquina virtual recién creada a un trabajo de respaldo de Veeam, todo esto utilizando PowerCLI y los cmdlet’s de PowerShell que nos ofrece Veeam.

El primer paso es identificar el evento dentro de vCenter de creación de una nueva máquina virtual. Puede haber otros métodos mejores, pero encontré una buena forma con el cmdlet “Get-VIEvent”, ya que incluye un campo llamado “FullFormattedMessage” que lleva la información del evento, sólo debo de buscar que patrón sigue cuando se crea una máquina virtual nueva. Sin embargo, hay diferencias entre como se describe una VM que es creada desde cero o con un OVA/OVF y una que es clonada.

Ejemplo de mensaje cuando es VM nueva:

FullFormattedMessage : Created virtual machine nueva1 on host.infra.lab in Lab

Ejemplo de mensaje cuando es clonada una VM:

FullFormattedMessage : Cloning Kiwi on host host.infra.lab in Lab to clon-kiwi on host host.infra.lab

Ok, ahora ya sabemos que textos “clave” deberíamos de incluír en el script, y nos auxiliaremos del cmdlet “Where-Object” para identificarlos entre los eventos generados en vCenter.

El Script está escrito pensando en ejecutarse cada 24 horas, si por ejemplo nuestros respaldos los ejecutamos una vez al día podemos correr el script antes de que se ejecute para que se incluyan las nuevas VM en nuestro entorno virtual.

Como se vería el Script…

## vSphere 5.5 + Veeam 8

## Aqui y ahora =)
$tiempo = Get-Date

## Buscamos en las ultimas 24 horas todas las VM creadas u OVA/OVF "deployed"
$nuevasVM1 = Get-VIEvent -Start $tiempo.AddDays(-1) | where {$_.FullFormattedMessage -like "*created virtual machine*"}
$nuevas1 = $nuevasVM1.Vm.Name
## Agregamos al job de respaldo $MiJob las VMs encontradas
foreach ($vm1 in $nuevas1) {
Find-VBRViEntity -Name $vm1 | Add-VBRViJobObject -Job $MiJob
}

## Buscamos en las ultimas 24 horas todas las VMs clonadas
$nuevasVM2 = Get-VIEvent -Start $tiempo.AddDays(-1) | where {$_.FullFormattedMessage -like "*Cloning*"}
$nuevas2 = $nuevasVM2.DestName
## Agregamos al job de respaldo $MiJob las VMs encontradas
foreach ($vm2 in $nuevas2) {
Find-VBRViEntity -Name $vm2 | Add-VBRViJobObject -Job $MiJob
}

Este script considera todas las VMs que se encuentran administradas en un mismo vCenter server, sin embargo lo podríamos editar para que sólo ciertas VMs sean agregadas, ejemplo podría ser que tengan cierto prefijo, sufijo, Host, Datacenter o Cluster. Un caso podría ser que las VMs de un cluster vayan a un Job y las de otro Cluster a un Job distinto. Mil variantes.

Espero les sea de utilidad.

spotify:track:5c5a2Ptu8eyIpljhQHjIqk