VMware ESXi con SAI que no tiene software de control para efectuar un apagado ordenado.
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 offrem 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"
ping -n 1 192.168.0.11 | find "TTL"
if errorlevel 1 goto ApagaVMs
goto sonda_11
:ApagaVMs
C:\SCRIPTS\ShutdownVMs.bat
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.
Puedes descargarlo de http://sourceforge.net/projects/blat/files/Blat%20Full%20Version/
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"
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 offrem 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
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\"
----------------------------------------------------------------------------------------
Muchisimas gracias. Es justo lo que buscaba.
ResponderEliminarsaludos.
Gracias a ti por comentar
EliminarEres un GENIO!!!!
ResponderEliminarAmigo 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
ResponderEliminarEstimado Jose Leon, le respondo por correo electrónico
Eliminarcomo puedo programar un apagado del host anfitrion la verdad no entiendo mucho de virtualizacion, ya probe ingresando /var/spool/cron/crontabs/root
ResponderEliminargracias
Puedo usar desde Windows
ResponderEliminarVMware vSphere PowerCLI
para parar un host ESXi FREE?