English French German Spain Italian Dutch Russian Portuguese Japanese Korean Arabic Chinese Simplified
  Lista de Casos        
        Formulario de Consultas

Como detectar un corte eléctrico y apagar ordenadamente un entorno ESXi 5

Escenario

VMware ESXi con SAI que no tiene software de control para efectuar un apagado ordenado.

Problema

He migrado buena parte de mis servidores a un entorno VMware ESXi 5, y ahora me encuentro con que los SAI no tienen software para VMware. Así que, cuando se produce un corte en el suministro eléctrico, los hosts ESXi se caen a las bravas, arrastrando todas las máquinas virtuales. Es una situación terrorífica.
Me fastidia tener que desechar los SAIs que tengo y tener que gastar dinero en otros nuevos. ¿Hay manera de aprovechar los SAI?


Solución


Sí que la hay. Lo vamos a hacer en entorno Windows, y lo explico en tres partes:

     1º  como controlar si se ha producido un corte en el suministro eléctrico.
     2º  como apagar de forma ordenada y automática, todas las máquinas virtuales.
     3º  y como apagar de forma ordenada y automática, todos los hosts ESXi 5.


1º  Sistema de detección de fallo en el suministro eléctrico.

El sistema de detección de fallo en el suministro eléctrico consta de dos partes, una de HW y otra de SW.

HW

Necesitamos usar, al menos, un dispositivo con dirección IP, por ejemplo, un viejo router. Mediante ping, verificamos si hay corte en el suministro eléctrico.
Pero yo voy a usar dos dispositivos con IP. ¿Por qué?. Porque así es más difícil obtener falsas alarmas de fallo en el suministro eléctrico.
A los dispositivos les voy a llamar sonda_10 y sonda_11, y los configuro con las IPs 192.168.0.10 y 192.168.0.11 respectivamente.
Conectamos la alimentación eléctrica de las sondas, en la misma regleta donde están conectados los SAIs de los ESXi. Y no olvides conectar sus latiguillos de red.

SW

Crearemos el fichero C:\SCRIPTS\FALLO.BAT
FALLO.BAT chequea la sonda 10 cada 10000 milisegundos (10 segundos).
Cuando la sonda 10 no responde, pasa a chequear la sonda 11.
La sonda 11 se chequea cada 90000 milisegundos (90 segundos).
Cuando la sonda 11 no responde, se inicia el BAT que contiene los comandos de apagado de los servidores ESXi

El contenido del fichero FALLO.BAT es el siguiente:
-----------------------------------------------------
rem @echo off

rem  puede ser que por algún motivo las sondas no respondan, por ejemplo, porque
rem  hemos hecho un cambio de IPs. Al inicar el equipo, casi no da tiempo a
rem detener la tarea y, como consecuencia, se inicia el Shutdown de todo el sistema.
rem  La situación sería caótica.
rem  Con el fin de prevenir en un futuro este problema, se hace un retardo de
rem 10 minutos en el inicio del chequeo de las sondas.

rem  retardo de 10 minutos (600000 milisegundos)
PING 1.1.1.1 -n 1 -w 600000 >NUL

rem  bucle de chequeo de la sonda_10
:sonda_10

PING 1.1.1.1 -n 1 -w 10000 >NUL
ping -n 1 192.168.0.10 | find "TTL"
if errorlevel 1 goto sonda_11
goto sonda_10


:sonda_11


PING 1.1.1.1 -n 1 -w 90000 >NUL


ping -n 1 192.168.0.10 | find "TTL"
if not errorlevel 1 goto sonda_10

ping -n 1 192.168.0.11 | find "TTL"
if errorlevel 1 goto ApagaVMs
goto sonda_11


:ApagaVMs

C:\SCRIPTS\ShutdownVMs.bat

-----------------------------------------------------
(Más adelante se explica como preparar ShutdownVMs.bat)

Con el programador de tareas, debemos crear una tarea que se ejecute al iniciar el equipo, y que arranque el archivo FALLO.BAT
A la tarea le he llamado FalloTask
Fíjate en las propiedades de la tarea programada, donde dice Detener si se ejecuta durante 72 horas, desactívalo.

Problema que se puede presentar con la programación de la tarea:
Al reiniciar la máquina por segunda vez y sucesivas, la tarea FalloTask configurada con "Ejecutar al iniciar el sistema", no se ejecuta.
Borré dos veces la tarea y la creé de nuevo. Funciona en el primer inicio del sistema, pero no en los sucesivos reinicios.
Solución: Ir a C:\WINDOWS\Tasks, hacer un clic con el derecho y Nuevo -> Tarea programada. Después clic derecho a la tarea y la configuras.

Opcional:

No suele ocurrir, pero alguna vez ha pasado, que una tarea programada, sin saber por qué, se detiene.
También puede suceder que la máquina con la tarea FalloTask se caiga.
Si quieres aumentar la fiabilidad del sistema, se puede, desde otra máquina, vigilar periódicamente que FALLO.BAT está en ejecución, y por consiguiente, que tampoco está caída. Y además, vamos a hacer que FALLO.BAT vigile al vigilante. De esta manera, las dos máquinas se vigilan mutuamente, haciendo casi infalible la monitorización de un fallo en el sistema eléctrico.
Si no estás interesado en añadir esta opción, salta al punto 2º Sistema de apagado de las máquinas virtuales.

Para ello vamos a usar BLAT.
BLAT es un conjunto de tres o cuatro ficheros que se puede usar en archivos BAT con el fin de enviar correos electrónicos.
En una máquina, distinta a la que está ejecutando la tarea FalloTask, hacemos lo siguiente:
Creamos la carpeta C:\SCRIPTS\BLAT y  copiamos ahí los tres o cuatro archivos que componen BLAT
Creamos el BAT C:\SCRIPTS\CheckTareactiva.bat
Contenido de CheckTareactiva.bat
-----------------------------------------------------
@echo off

schtasks /query /S 192.168.0.8 /u miuser /p mipass | find "FalloTask                            Cuando se inicia el sist Ejecut"
if errorlevel 1 c:\scripts\blat\blat.exe - -to micuenta@midominio.com -server mail.servidor.com -f cuenta@dominio.com -subject "Fallo.BAT no funciona" -body "Revisa la tarea FALLO.BAT en el PC 192.168.0.8"
-----------------------------------------------------

Sustituye 192.168.0.8 por la IP de tu máquina corriendo FalloTask.
Sustituye miuser por un usuario de tu máquina corriendo FalloTask
Sustituye mipass por la contraseña del usuario
Sustituye FalloTask por el nombre de la tarea que hayas usado (ten en cuenta que si varia el número de caracteres del nombre de la tarea, has de variar también el número de espacios).
Sustituye micuenta@midominio.com por la cuenta a la que quieres enviar la alerta.
Sustituye mail.servidor.com por el servidor de correo.
Sustituye cuenta@dominio.com por la cuenta remitente. (Puedes usar la misma cuenta como -to y como -f).

Problema que se puede presentar con schtasks ...
Puede que obtengas una respuesta de Error: Error de inicio de sesión. Y por mas que compruebas el usuario y la contraseña, siempre obtienes un Error: Error de inicio de sesión.
Solución: Abre el registro de Windows y busca [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
Ahí veras ForceGuest. Verifica que tenga como datos el valor 0 (cero)
(Si quieres información sobe ForceGuest la puedes encontrar en http://support.microsoft.com/kb/290403/es)
Con el programador de tareas, debemos crear una tarea que se ejecute al iniciar el equipo, y que arranque el archivo CheckTareactiva.BAT
A la tarea le he llamado CheckTATask
Ahora vamos a modificar FALLO.BAT para que vigile al vigilante, y queda de la siguiente manera:
-----------------------------------------------------
rem @echo off

rem  puede ser que por algún motivo las sondas no respondan, por ejemplo, porque
rem  hemos hecho un cambio de IPs. Al inicar el equipo, casi no da tiempo a
rem detener la tarea y, como consecuencia, se inicia el Shutdown de todo el sistema.
rem  La situación sería caótica.
rem  Con el fin de prevenir en un futuro este problema, se hace un retardo de
rem 10 minutos en el inicio del chequeo de las sondas.

rem  retardo de 10 minutos (600000 milisegundos)
PING 1.1.1.1 -n 1 -w 600000 >NUL

rem  bucle de chequeo de la sonda_10
:sonda_10

REM  por si acaso, verifico la sonda 11, y si falla, mando un aviso con el fin de restaurar la sonda.
ping -n 1 192.168.0.11 | find "TTL"
if errorlevel 1 c:\scripts\blat\blat.exe -p gmailsmtp -to buzon@gmail.com -subject "Sonda 11 no funciona" -body "Revisa la sonda 11 IP.192.168.0.11" -server 127.0.0.1:1099
REM  finaliza verificacion de la sonda 11

REM  verifico la sonda 10, y si falla, me voy a verificar la sonda 11
PING 1.1.1.1 -n 1 -w 30000 >NUL
ping -n 1 192.168.0.10 | find "TTL"
if errorlevel 1 goto sonda_11
REM  finaliza la verificacion de la sonda 10

REM verifico que el vigilante me vigila
schtasks /query /S 192.168.0.8 /u miuser /p mipass | find "CheckTATask                          Cuando se inicia el sist Ejecut"
if errorlevel 1 c:\scripts\blat\blat.exe -p gmailsmtp -to buzon@gmail.com -subject "CheckTaTask no funciona" -body "Revisa la tarea CheckTaTask en el PC 192.168.0.8" -server 127.0.0.1:1099
REM finaliza la verificación del vigilante

REM  vuelvo a verificar la sonda 10, es el ciclo natural
goto sonda_10


:sonda_11

PING 1.1.1.1 -n 1 -w 30000 >NUL

REM  por si acaso, verifico la sonda 10, y si falla, mando un aviso con el fin de restaurar la sonda.
ping -n 1 192.168.0.10 | find "TTL"
if not errorlevel 1 goto sonda_10
c:\scripts\blat\blat.exe -p gmailsmtp -to buzon@gmail.com -subject "Sonda 10 no funciona" -body "Revisa la sonda 10 IP.192.168.0.10" -server 127.0.0.1:1099
REM  finaliza la verificacion de la sonda 10

REM  verifico la sonda 11, y si falla, me voy a apagar las máquinas.
ping -n 1 192.168.0.11 | find "TTL"
if errorlevel 1 goto ApagaVMs
REM  finaliza la verificacion de la sonda 11.

REM  vuelvo a verificar la sonda 11, no es el ciclo normal, por lo que se producen envios de fallo en la sonda 10 cada 2 minutos aproximadamente.
goto sonda_11


:ApagaVMs


C:\SCRIPTS\ShutdownVMs.bat
-----------------------------------------------------

El envío de correos electrónicos con Blat, presenta dificultades cuando usas cuentas de servidores de correo que exigen conexiones SSL. Eso pasa por ejemplo con GMAIL. Para solucionarlo instala stunnel.

2º  Sistema de apagado de las máquinas virtuales.

Hay que hacer dos configuraciones, una en cada host ESXi, y otra en cada VM.

host ESXi

Con vSphere nos conectamos al vCenter, o bien directamente a cada uno de los hosts ESXi.
Vamos a la pestaña Configuración -> Virtual Machine Startup/Shutdown -> Properties
Marca -> Allow virtual machines to start and stop automatically with the system
En el apartado Default Shutdown Delay, es muy conveniente reducir el tiempo de retardo entre máquinas, que por defecto son 120 segundos, ya que los SAI puede que no aguanten tanto tiempo. Yo lo he configurado en 2 segundos. Y en Shutdown Action selecciona Guest Shutdown. 

VM

Esto hay que hacerlo en todas las máquinas virtuales:
-Deben tener instaladas las VMware Tools.
-Vamos a la carpeta donde se ha instalado VMware Tools, que suele ser C:\Archivos de programa\VMware\VMware Tools, y copia poweroff-vm-default.bat como apagar.bat
-apagar.bat debe contener c:\windows\system32\shutdown.exe /s /f /t 1 (Si necesitas detener servicios de forma ordenada, puedes añadir al comienzo comandos NET STOP...)
-Abre VMware Tools, y ve a la pestaña Scripts. En Evento de script selecciona Cerrar el sitema operativo guest. Selecciona Script personalizado, pincha en examinar y elige apagar.bat



3º  Sistema de apagado de los hosts ESXi.

El sistema de apagado lo vamos a montar en la misma máquina en la que está ejecutándose FALLO.BAT

Debes tener instalada una de las versiones siguiente de .NET Framework
  • .NET Framework 2.0 with Service Pack 2
  • .NET Framework 3.0 or .NET Framework 3.0 with Service Pack 1, or Service Pack 2
  • .NET Framework 3.5 or .NET Framework 3.5 with Service Pack 1
También debes tener instalado PowerShell 2.0 para Windows XP SP3 VMware vSphere PowerCLI

Creamos un archivo llamado C:\SCRIPTS\shutdownVMs.ps1 con el contenido:
----------------------------------------------------------------------------------------
$names = "172.26.1.200","172.26.1.201","172.16.50.1.202"

connect-VIServer -Server $names -User mi_user -Password mi_pass | %{
  Get-VMHost -Server $_ | %{
         $_.ExtensionData.ShutdownHost_Task($TRUE)
  }
}
----------------------------------------------------------------------------------------

En $names, sustituye las IPs por las de tus hosts ESXi.
Cambia mi_user por el User de tu ESXi
Cambia -mi_pass por la Password de tu ESXi

Ahora creamos un archivo llamado C:\SCRIPTS\shutdownVMs.bat con el contenido:
----------------------------------------------------------------------------------------
C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -psc "C:\Archivos de programa\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -c ". \"c:\scripts\shutdownVMs.ps1\"
----------------------------------------------------------------------------------------

7 comentarios:

  1. Muchisimas gracias. Es justo lo que buscaba.
    saludos.

    ResponderEliminar
  2. Amigo como estas? Muchas gracias por este proceso tan complejo que compartes con nosotros. Tengo una inquietud y me gustaría comunicartela ya que quizà me estoy equivocando en algun procedimiento o debo instalar algun software adicional, te explico; En mi trabajo actualmente tengo dos ESXi 5.5 funcionando. En cada ESX tengo un UPS modelo Smart-UPS 3000, con un cable USB que me permite monitorear el status de energìa en cada UPS y si ocurre alguna incidencia o corte prolongado de luz la baterìa entra en acción. Luego de un tiempo (2 horas) si no se restablece la luz electrica, el UPS en teorìa deberìa mandar un comando de apagado a todas las VM y luego el ESX como tal. Mi pregunta es la siguiente: En el punto 2 "Sistema de apagado de las VM", el guion 4 (Abre VMware tools, y ve a la pestaña Scripts" no logro ver esa pestaña ni en el Vsphere Client en los Settings de cada VM y tampoco logro ver la pestaña dentro de la VM en el icono de barra de tareas de VMware. Por favor puedes darme luces al respecto? De resto ya tengo todo lo demàs preparado, el unico detalle es ese. Muchas gracias nuevamente por todo. Saludos

    ResponderEliminar
    Respuestas
    1. Estimado Jose Leon, le respondo por correo electrónico

      Eliminar
  3. como puedo programar un apagado del host anfitrion la verdad no entiendo mucho de virtualizacion, ya probe ingresando /var/spool/cron/crontabs/root
    gracias

    ResponderEliminar
  4. Puedo usar desde Windows
    VMware vSphere PowerCLI
    para parar un host ESXi FREE?

    ResponderEliminar