Detectar VMs no respaldadas por Veeam con PowerCLI (Parte 2)

En esta segunda y última parte de la entrada seguiremos justo donde lo dejamos en la anterior y añadiremos un poco más de funcionalidad a nuestro script buscador de máquinas virtuales fuera de backup. Concretamente veremos cómo gestionar excepciones y cómo enviar notificaciones de correo periódicas.

  1. Detectar VMs no respaldadas por Veeam con PowerCLI (Parte 1).
  2. Detectar VMs no respaldadas por Veeam con PowerCLI (Parte 2).

En la entrada anterior nos quedamos con un pequeño script con el que ya conseguíamos sacar las máquinas virtuales sin backup pero poco más:

# Obtenemos todas las máquinas virtuales de la infraestructura que estén encendidas
$Vms = Get-VM | Where-Object PowerState -eq 'PoweredOn'

# Declaramos un array vacío donde almacenar los nombres de las VMs fuera de backup
$VmsSinBackup = @()

# Recorremos la colección de VMs
ForEach ($Vm in $Vms) {
    # Si la VM tiene el Custom Attribute "Sobrebits" sin contenido...
    If (!$Vm.CustomFields.Item("Sobrebits")) {
        # ... añadimos dicha VM a nuestra array de VMs no respaldadas por Veeam
        $VmsSinBackup += $Vm.Name
    }
}
# Mostramos las $VmsSinBackup
$VmsSinBackup

Gestionando las excepciones

Tarde o temprano utilizando este script os encontraréis con la situación en la que se reporta una máquina virtual fuera de backup que realmente debería estarlo, ya sea porque es una máquina de test, una demo o cualquier otra situación. En esta parte vamos a añadir de una forma extremadamente sencilla un archivo de excepciones donde iremos añadiendo el nombre de dichas máquinas virtuales fuera de backup.

Lo primero que haremos será guardar nuestro script en una carpeta, para este ejemplo será C:\Scripts\Get-VmNoBackup.ps1. Un ejemplo de la salida del script sin excepciones sería este:

Máquinas virtuales fuera de backupSabiendo la salida del script podemos proceder a crear el archivo de excepciones, con el que quitaremos las VMs de test de nuestro listado. Nuestro archivo de excepciones simplemente será un archivo .txt ubicado en la misma carpeta del script:  C:\Scripts\Get-VmNoBackup_Excepciones.txt.

PS C:\Scripts> Get-ChildItem
Get-VmNoBackup.ps1
Get-VmNoBackupExcepciones.txt

La idea es que en dicho archivo de excepciones añadamos un nombre de VM por línea, en nuestro caso quedaría así:

Excepciones máquinas virtuales fuera de backupA partir de ahí solo nos queda leer el contenido de dicho archivo utilizando Get-Content y añadir este criterio al if en el que checkeamos si existe el Custom Attribute:

# Leemos el archivo de excepciones
$Excepciones = Get-Content -Path "$PSScriptRoot\Get-VmNoBackup_Excepciones.txt"

# Obtenemos todas las máquinas virtuales de la infraestructura que estén encendidas
$Vms = Get-VM | Where-Object PowerState -eq 'PoweredOn'

# Declaramos un array vacío donde almacenar los nombres de las VMs fuera de backup
$VmsSinBackup = @()

# Recorremos la colección de VMs
ForEach ($Vm in $Vms) {
    # Si la VM tiene el Custom Attribute "Sobrebits" sin contenido...
    If (!$Vm.CustomFields.Item("Sobrebits") -and $Excepciones -notcontains $Vm.Name) {
        # ... añadimos dicha VM a nuestra array de VMs no respaldadas por Veeam
        $VmsSinBackup += $Vm.Name
    }
}
# Mostramos las $VmsSinBackup
$VmsSinBackup

Repasemos las modificaciones:

  • En la línea 2 leemos mediante Get-Content el contenido del archivo de excepciones y lo añadimos a la variable $Excepciones.
  • En la línea 13 añadimos una nueva condición al if en la que el nombre de la VM ($Vm.Name) no debe estar dentro del array de $Excepciones.

Y este es el resultado de ejecutar el script con las últimas modificaciones:

Máquinas virtuales sin backup con excepcionesComo podemos ver ya no aparecen las VMs Sobrebits-Test1 y Sobrebits-Test2.

Otra aproximación para gestionar las excepciones podría ser utilizar tags de vSphere sobre las máquinas virtuales que podrían ser leídos por nuestro script, poner excepciones de carpetas o básicamente cualquier criterio que se os ocurra.

Enviando el resultado del script vía correo electrónico

Para brindar un poco más de funcionalidad al script podemos hacer que éste nos envíe un reporte con las máquinas virtuales fuera de backup por correo electrónico tal como vimos en la entrada “Enviar correo desde PowerShell”.

Para ello necesitaremos de un servidor SMTP desde el que estemos autorizados a enviar correo y hacer unas pequeñas modificaciones a nuestro script.

En primer lugar deberemos configurar los parámetros para la conexión smtp:

# Establecemos configuración SMTP
$from = "veeam@sobrebits.com"
$to = "marc@sobrebits.com"
$subject = "Máquinas virtuales fuera de backup"
$smtpserver = "mail.sobrebits.com"
$smtpport = 25

Y al final del script, en vez de mostrar el contenido enviamos el correo electrónico (siempre y cuando existan máquinas virtuales fuera de backup):

# Si existen máquinas virtuales fuera de backup...
if ($VmsSinBackup) {
    # ... enviamos correo
    Send-MailMessage -From $from -To $to -Subject $subject -Body $($whitelist -join "`n") -SmtpServer $smtpserver -Port $smtpport
}

Aquí no hay mucho que explicar puesto que no hemos hecho nada que no hicieramos ya en “Enviar correo desde PowerShell”, simplemente aclarar que en el parámetro -Body concatenamos el array y lo juntamos con retornos de carro puesto que esta variable espera un string.

Últimos retoques

Lo último que queda para dar por finalizado nuestro script es programar su ejecución. No voy a explicar al detalle cómo hacerlo puesto que ya se ha tratado en anteriores entradas, aquí os dejo las referencias:

Por último decir que con este método si eliminamos una máquina de backup va a seguir reportándose como máquina dentro de backup puesto que el Custom attribute no se borra al quitar la máquina de Veeam. Es por ello que os recomiendo periódicamente eliminar el contenido del Custom Attribute mediante Set-Annotation sobre todas las máquinas virtuales del entorno.

Poniéndolo todo junto

Después de seguir el proceso de las dos partes de esta entrada debería quedar un script parecido a este:

# Conectamos a vCenter
$vcenter_ip = "192.168.168.168"
$vcenter_creds = Import-Clixml -Path "$PSScriptRoot\VMware_creds.xml"
Connect-VIServer -Server $vcenter_ip -Credential $vcenter_creds -WarningAction SilentlyContinue | Out-Null

# Establecemos configuración SMTP
$from = "veeam@sobrebits.com"
$to = "marc@sobrebits.com"
$subject = "Máquinas virtuales fuera de backup"
$smtpserver = "mail.sobrebits.com"
$smtpport = 25

# Leemos el archivo de excepciones
$Excepciones = Get-Content -Path "$PSScriptRoot\Get-VmNoBackup_Excepciones.txt"

# Obtenemos todas las máquinas virtuales de la infraestructura que estén encendidas
$Vms = Get-VM | Where-Object PowerState -eq 'PoweredOn'

# Declaramos un array vacío donde almacenar los nombres de las VMs fuera de backup
$VmsSinBackup = @()

# Recorremos la colección de VMs
ForEach ($Vm in $Vms) {
    # Si la VM tiene el Custom Attribute "Sobrebits" sin contenido...
    If (!$Vm.CustomFields.Item("Sobrebits") -and $Excepciones -notcontains $Vm.Name) {
        # ... añadimos dicha VM a nuestra array de VMs no respaldadas por Veeam
        $VmsSinBackup += $Vm.Name
    }
}

# Si existen máquinas virtuales fuera de backup...
if ($VmsSinBackup) {
    # ... enviamos correo
    Send-MailMessage -From $from -To $to -Subject $subject -Body $($whitelist -join "`n") -SmtpServer $smtpserver -Port $smtpport
}

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

¡Espero que esta doble entrada os sirva para ahorraros disgustos de cara a futuro!

Deja un comentario