Reporte de estado de Hyper-V Replica

En el blog anteriormente ya he hablado algo sobre Hyper-V Replica, aunque apuntando más a entender cómo funciona y que se debe tener en cuenta a la hora de implementar esta solución. El enlace a la publicación anterior sobre Hyper-V Replica es el siguiente:

Para entender mejor que es lo que estamos haciendo vamos ir desarrollando el informe, de forma que podamos ir observando con detalle los puntos tratados.

Manos a la obra

Vamos a comenzar el script ordenando la información requerida: en nuestro caso es necesario conocer cuáles son los servidores con el rol de Hyper-V que participan en la implementación de la solución. Considerando el diseño de la infraestructura de la herramienta tenemos 2 roles fundamentales: el servidor primario, que contiene las VMs en ejecución (o no) y el servidor secundario, que se encarga de alojar la transferencia de información y permanece en una postura pasiva hasta que se realice el Failover. Con lo anterior vamos a definir los parámetros de nuestra función:

[CmdletBinding()]
param (
    [Parameter(Position = 0, HelpMessage = 'Servidor de Hyper-V Replica primario')]
    [String]$PrimaryHyperV,

    [Parameter(HelpMessage = 'Servidor de Hyper-V Replica secundario')]
    [String]$SecondaryHyperV

)

Perfecto! Tenemos los servidores, ahora necesitamos saber cómo comprobar la salud de la implementación. Para ello vamos usar el cmdlet Get-VM, de la siguiente forma:

Get-VM -computername $PrimaryHyperV, $SecondaryHyperV | select Name,State,ReplicationHealth

En donde seleccionamos el nombre de la VM, el estado (si está apagada o corriendo) y la salud de la replicación. En consola obtenemos la siguiente salida:

Reporte de Hyper-V Replica

Con lo que desarrollamos anteriormente, es posible agregar un poco más de lógica y discriminar para que nos avise solamente cuando las VMs no se encuentran en estado normal:

Get-VM -computername $PrimaryHyperV, $SecondaryHyperV `
| ? { $_.ReplicationHealth -eq "Warning" -or $_.ReplicationHealth -eq "Critical" } `
| select Name,State,ReplicationHealth

Otra opción es utilizar el cmdlet Get-VMReplication para obtener el status de la replicación, puediendo armar algo así:

$VmReplication = Get-VMReplication -ComputerName $PrimaryHyperV, $SecondaryHyperV  `
| Select-Object @{Name="Maquinas Virtuales";Expression={($_.Name)}},
                @{Name="Estado de la replica";Expression={($_.State)}},
                @{Name="Estado";Expression={($_.Health)}},
                @{Name="Host";Expression={($_.PrimaryServer)}} | ConvertTo-HTML -fragment

Como se muestra en el bloque anterior de código, se genera como salida un bloque HTML (tabla) que define los encabezados: Maquinas Virtuales, Estado de la replica, Estado, Host para desplegar más información al respecto.

Recta final

Ya con este resultado podemos generar un mail que nos envíe esta tabla y así no estar revisando cada día la infraestructura de forma manual. Para ello agregamos la tabla resultante del cmdlet anterior como HTML al cuerpo del mail a enviar:

$Report = Get-VM -computername $PrimaryHyperV, $SecondaryHyperV | select Name,State,ReplicationHealth

$SMTPServer = "smtp.domain.com"
$SMTPCredentials = new-object Net.NetworkCredential("username", "PassW0rd")
$SMTP = new-object Net.Mail.SmtpClient($SMTPServer)
$SMTP.UseDefaultCredentials = $false
$SMTP.Credentials = $SMTPCredentials

$email.Subject = "Reporte de replicas"
$email.body = $Report
$smtp.Send($email)

También podemos usar la función Send-MailMessage.

En estos momentos tenemos un informe funcional, que podemos programar para que se ejecute, por ejemplo, una vez al día.

Con todo lo que vimos anteriormente podemos armar un reporte, sumando cambios visuales con CSS, de la siguiente manera:

Happy scripting!

Comments