Listar máquinas virtuales con snapshots antiguos con PowerCLI

Como administradores de sistemas vSphere una de las cosas que siempre deberíamos tener controlada en nuestra infraestructura es la existencia de máquinas virtuales con snapshots no utilizados. Como siempre digo en esta clase de entradas, hacer esto a mano en una infraestructura pequeña con pocas manos administrándola es algo viable, pero es una solución que no escala para nada bien. Es por ello que en esta entrada veremos cómo listar maquinas virtuales con snapshots antiguos con PowerCLI.

Listar máquinas virtuales con snapshots antiguos con PowerCLI

¿Por qué hay que eliminar snapshots antiguos en VMware?

En vSphere los snapshots pueden suponer una herramenta increíblemente útil en nuestro día a día o una pesadilla dependiendo del uso que le demos. VMware facilita una serie de buenas prácticas en ésta entrada.

Como indica VMware, no debereíamos tener snapshots más antiguos de 72 horas o podemos incurrir en:

  • Llenado del storage por culpa de que el snapshot no para de crecer.
  • Bajada de rendimiento en el sistema.

Yo por mi parte añadiría que eliminar un snapshot de varios cientos de GB o de más de 1TB no es la mejor de las experiencias 🤦‍♂️.

Listando snapshots antiguos con PowerCLI

Vamos a ver el pequeño script que nos ayudará a mantener a raya los snapshots antiguos con PowerCLI:

Spoiler: si únicamente quieres el one-liner para obtener las VMs puedes dirigirte directamente a las líneas resaltadas del script

#### Variables ####
# Conexión a vCenter
$VcenterIP = "192.168.168.168"
$VcenterCreds = Import-Clixml -Path "$PSScriptRoot\Credenciales\VMware_rw.xml"

# Antigüedad snapshot
$Days = 3

# Configuración del correo
$Body = "Snapshots con más de $Days días: `n`n"
$From = "monitorizacion@sobrebits.com"
$To = "admin@sobrebits.com"
$Subject = "VMs con Snapshot anterior a $Days días"
$SmtpServer = "mailserver.sobrebits.com"
$SmtpPort = 25

#### Cuerpo del script ####

# Conectamos al vCenter
Connect-VIServer -Server $VcenterIP -Credential $VcenterCreds -WarningAction SilentlyContinue | Out-Null

# Recuperamos todas las VMs con snapshot antiguos
$Vms = (Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-$Days)}).VM.Name | Sort-Object

# Enviamos correo con el listado (en caso de que hubiera alguna VM con snapshot antiguo)
if ($Vms) {
    $Body += $Vms -join "`n"
    Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -SmtpServer $SmtpServer -Port $SmtpPort
}

# Desconectamos del vCenter
Disconnect-VIServer -Confirm:$false

Veamos qué hemos hecho aquí:

  • Líneas 3-4: Declaramos la IP y las credenciales del servidor vCenter.
  • 7: Declaramos la cantidad de días de antigüedad del snapshot. En nuestro caso seguimos las buenas prácticas de VMware y configuramos 3.
  • 10-15: Configuramos los parámetros para el envío de correo.
  • 20: Conectamos a vCenter.
  • 23: Aquí está la «chicha» del script, donde obtenemos todas las máquinas virtuales con snapshot anterior a 3 días:
    • Get-VM: Obtenemos todas las máquinas virtuales.
    • Get-Snapshot: Obtenemos todos los snapshots de las máquinas virtuales.
    • Where-Object {$_.Created -lt (Get-Date).AddDays(-$Days)}: Nos quedamos únicamente con los snapshots cuya fecha de creación ($_.Created) sea anterior (-lt) a la fecha actual menos 3 días ((Get-Date).AddDays(-$Days)).
    • .VM.Name: Seleccionamos únicamente el nombre de la VM a la que pertenece dicho snapshot.
  • 26-29: Si existen máquinas dentro de $Vms enviamos el correo con el listado de las máquinas virtuales.
  • 32: Desconectamos del vCenter.

Resumiendo, cada vez que el script se ejecute revisará todas las máquinas vituales del entorno y revisará si contienen snapshots y si éstos son anteriores a 3 días. De existir alguno nos enviará un resumen de las máquinas virtuales afectadas directamente a nuestra bandeja de correo para que seamos nosotros mismos los que gestionemos el caso.

Conclusión

Si utilizamos la ejecución programada de scripts de PowerShell para realizar este check de forma diaria nos vamos a asegurar de tener siempre controlada la existencia de snapshots antiguos con PowerCLI, con lo que tendremos una infraestructura más optimizada.

Para los más atrevidos, podríamos modificar el script para que, en vez de enviar un correo, ejecutara Remove-Snapshot para eliminar directamente sin preguntar los snapshots antiguos.

¡Nos leemos en la próxima!

Deja un comentario