jueves, 4 de junio de 2026

Hermes: apagado controlado de Proxmox desde Ubuntu Server

En el artículo anterior vimos cómo permitir que Hermes solicite el apagado de Ubuntu Server sin ejecutar directamente comandos peligrosos como shutdown, reboot, poweroff o halt.

En este nuevo artículo vamos a dar un paso más: permitir que Hermes solicite también el apagado del host Proxmox, es decir, del servidor físico o sistema anfitrión donde se está ejecutando la máquina virtual Ubuntu.


La idea final será esta:

Usuario
  ↓
Hermes
  ↓
Solicita apagar Ubuntu Server
  ↓
Solicita apagar Proxmox
  ↓
Ubuntu se apaga primero
  ↓
Proxmox se apaga después

Objetivo del artículo

El objetivo no es que Hermes tenga control total sobre Proxmox, sino crear un mecanismo controlado para que pueda solicitar algo muy concreto: Apagar Proxmox de forma programada y segura.

Y además hacerlo respetando un orden lógico:

  1. Primero se solicita el apagado de Ubuntu Server.
  2. Después se solicita el apagado del host Proxmox.
  3. Ubuntu se apaga antes.
  4. Proxmox se apaga unos minutos después.

Esto es importante porque Hermes está instalado dentro de Ubuntu. Si apagamos Proxmox inmediatamente, la máquina virtual se detiene de golpe. En cambio, si primero dejamos programado el apagado de Proxmox y luego apagamos Ubuntu, cada sistema tiene tiempo de cerrar correctamente.

Filosofía de seguridad

No queremos que Hermes ejecute directamente algo como:

ssh root@proxmox "shutdown -h +10"

Aunque técnicamente podría funcionar, no es la opción más limpia ni la más prudente.

La idea será seguir una filosofía similar a la del artículo anterior:

  • Hermes solicita.
  • Ubuntu valida.
  • Proxmox ejecuta.

O, dicho de otra forma:

  • Hermes no apaga directamente Proxmox.
  • Hermes deja una solicitud controlada.
  • Un mecanismo preparado previamente ejecuta únicamente la acción permitida.

Enfoque que vamos a seguir

En este caso tenemos dos sistemas implicados:

Ubuntu Server
└── donde se ejecuta Hermes
Proxmox
└── host que queremos apagar después

Por tanto, necesitaremos preparar una comunicación segura entre ambos.

La solución más sencilla y razonable en un homelab será usar SSH con clave, pero con mucho cuidado:

Ubuntu Server → conecta por SSH → Proxmox

La clave estará pensada solo para esta tarea, y lo ideal será que Proxmox permita ejecutar únicamente el comando necesario para programar o cancelar el apagado.

Resultado esperado

Cuando todo esté configurado, podremos pedirle a Hermes algo parecido a esto:

Solicita el apagado controlado del homelab.

  • Primero solicita el apagado de Proxmox dentro de 10 minutos.
  • Después solicita el apagado de Ubuntu Server dentro de 1 minuto.
  • No ejecutes shutdown directamente.
  • Usa únicamente los mecanismos de solicitud ya configurados.

Y el flujo quedaría así:

Hermes crea solicitud para Proxmox
  ↓
Ubuntu procesa la solicitud
  ↓
Ubuntu envía a Proxmox la orden de apagado programado
  ↓
Hermes crea solicitud para Ubuntu
  ↓
Ubuntu programa su propio apagado
  ↓
La VM Ubuntu se apaga
  ↓
Unos minutos después se apaga Proxmox

Advertencia importante

Este artículo toca una parte delicada del homelab: el apagado del host Proxmox.

Eso significa que un error podría dejar fuera de servicio todas las máquinas virtuales y contenedores que dependan de ese servidor.

Por eso lo haremos paso a paso, comprobando cada acción antes de continuar, y sin dar permisos amplios innecesarios.

La idea no es abrir una puerta peligrosa, sino crear un mecanismo muy concreto, limitado y fácil de auditar.

En resumen, no vamos a darle a Hermes el control completo de Proxmox, vamos a darle una forma controlada de solicitar su apagado.

En el siguiente paso empezaremos preparando el acceso seguro desde Ubuntu Server hacia Proxmox.

Paso 1: localizar la IP de Proxmox

Antes de configurar nada desde Ubuntu, necesitamos saber con seguridad la IP del host Proxmox.

En la consola de Proxmox, ejecuta:

  • hostname -I

192.168.1.20

Perfecto, entonces anotamos:

  • IP de Proxmox: 192.168.1.20
  • IP de Ubuntu Server / Hermes: 192.168.1.22

Paso 2: comprobar conectividad desde Ubuntu hacia Proxmox

Ahora vuelve a la consola de Ubuntu Server, donde está instalado Hermes, y ejecuta:

  • ping -c 4 192.168.1.20

Con esto comprobamos que Ubuntu puede ver al host Proxmox en la red.


Perfecto. La conectividad está correcta:

  • Ubuntu Server / Hermes: 192.168.1.22
  • Proxmox: 192.168.1.20
  • Resultado: comunicación OK

Paso 3: comprobar acceso SSH a Proxmox

Desde la consola de Ubuntu Server, prueba ahora la conexión SSH al host Proxmox:

  • ssh root@192.168.1.20

La primera vez puede preguntarte algo parecido a:

Are you sure you want to continue connecting (yes/no/[fingerprint])?

En ese caso escribe:

yes

Después te pedirá la contraseña de root de Proxmox.


Perfecto. Has conseguido entrar correctamente por SSH desde Ubuntu al host Proxmox.

Tenemos confirmado:

  • Ubuntu Server / Hermes: 192.168.1.22
  • Proxmox: 192.168.1.20
  • Usuario probado: root
  • SSH: funciona correctamente
  • Host Proxmox: servidor

Paso 4: salir de la sesión SSH de Proxmox

Ahora sal de Proxmox para volver a la consola de Ubuntu Server.

Ejecuta:

  • exit

Paso 5: crear una clave SSH específica para Hermes → Proxmox

Ahora vamos a crear una clave SSH en Ubuntu para que pueda conectar con Proxmox sin pedir contraseña.

Ejecuta en Ubuntu Server:

  • ssh-keygen -t ed25519 -f ~/.ssh/hermes_proxmox_shutdown -C "hermes-proxmox-shutdown"

Cuando pregunte por la contraseña de la clave:

Enter passphrase

pulsa Enter.

Y cuando pregunte de nuevo:

Enter same passphrase again

pulsa Enter otra vez.

Perfecto. La clave se ha creado correctamente:

  • Clave privada: /home/madiazg/.ssh/hermes_proxmox_shutdown
  • Clave pública: /home/madiazg/.ssh/hermes_proxmox_shutdown.pub
  • Comentario: hermes-proxmox-shutdown

Paso 6: copiar la clave pública a Proxmox

Ahora vamos a autorizar esa clave en el usuario root de Proxmox.

Ejecuta desde Ubuntu Server:

  • ssh-copy-id -i ~/.ssh/hermes_proxmox_shutdown.pub root@192.168.1.20

Te pedirá la contraseña de root de Proxmox.


Perfecto. La clave pública ya está instalada en Proxmox para el usuario root.

Paso 7: probar acceso SSH con la clave específica

Desde Ubuntu Server, ejecuta:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20

Si todo está correcto, debería entrar en Proxmox sin pedir contraseña.

Cuando entres, no ejecutes nada más todavía. Solo sal con:

exit

Hasta ahora tenemos:

  • Ubuntu Server / Hermes: 192.168.1.22
  • Proxmox: 192.168.1.20
  • Clave SSH: /home/madiazg/.ssh/hermes_proxmox_shutdown
  • Acceso SSH sin contraseña: correcto

Paso 8: ejecutar un comando remoto de prueba en Proxmox

Ahora, desde Ubuntu Server, ejecuta este comando:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "hostname"

Esto no apaga nada. Solo comprobará que Ubuntu puede ejecutar una orden remota en Proxmox y devolver el nombre del host.

servidor

Perfecto. La prueba remota funciona correctamente:

  • Ubuntu ha ejecutado un comando en Proxmox
  • Resultado devuelto por Proxmox: servidor

Eso confirma que ya tenemos esta parte funcionando:

Ubuntu Server → SSH con clave → Proxmox

Paso 9: probar una orden remota segura con fecha/hora

Antes de tocar apagados, vamos a hacer una segunda prueba inocua para confirmar que el comando se ejecuta realmente en Proxmox.

Desde Ubuntu Server, ejecuta:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "date"

Esto solo devolverá la fecha y hora del host Proxmox.

Thu Jun  4 07:44:59 PM WEST 2026

Perfecto. Segunda prueba correcta:

  • Comando remoto: date
  • Ejecutado en: Proxmox
  • Respuesta: Thu Jun 4 07:44:59 PM WEST 2026

Ya tenemos validado que Ubuntu puede ejecutar comandos remotos en Proxmox mediante la clave SSH.

Paso 10: probar programación de apagado en Proxmox, pero cancelable

Ahora vamos a hacer una prueba real, pero segura: programar el apagado de Proxmox para dentro de 10 minutos.

Desde Ubuntu Server, ejecuta:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "shutdown -h +10"

Esto no apagará Proxmox inmediatamente. Solo dejará el apagado programado.

Shutdown scheduled for Thu 2026-06-04 19:56:41 WEST, use 'shutdown -c' to cancel.

Perfecto. Proxmox ha aceptado la orden y ha dejado programado el apagado:

Shutdown scheduled for Thu 2026-06-04 19:56:41 WEST

Paso 11: cancelar el apagado programado de Proxmox

Ahora cancélalo desde Ubuntu Server con:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "shutdown -c"

Sin salida

Perfecto. En este caso, “sin salida” es normal.

Hasta aquí ya tenemos validado:

  • Ubuntu puede conectar con Proxmox por SSH sin contraseña
  • Ubuntu puede ejecutar comandos remotos en Proxmox
  • Ubuntu puede programar el apagado de Proxmox
  • Ubuntu puede cancelar el apagado de Proxmox

Paso 12: comprobar que Proxmox sigue activo

Desde Ubuntu Server, ejecuta:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "uptime"

Esto solo confirma que Proxmox sigue funcionando con normalidad después de cancelar el apagado.

19:51:24 up  2:36,  2 users,  load average: 0.05, 0.05, 0.06

ePrfecto. Proxmox sigue activo y funcionando con normalidad:

19:51:24 up 2:36
load average: 0.05, 0.05, 0.06

Ya tenemos validada toda la parte SSH.

Paso 13: crear el fichero de solicitud para Proxmox

Ahora vamos a preparar el mecanismo controlado por fichero, igual que hicimos con Ubuntu.

En este caso usaremos este fichero:

/home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt

Y este contenido:

apagar_proxmox_10min

Todavía no lo usará ningún script. Primero solo vamos a crear el fichero manualmente para verificar ruta y permisos.

Ejecuta en Ubuntu Server:
  • echo "apagar_proxmox_10min" > /home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt
Después comprueba el contenido con:
  • cat /home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt

apagar_proxmox_10min

Perfecto. El fichero de solicitud para Proxmox está creado correctamente

Paso 14: crear el script de control para Proxmox

Ahora vamos a crear un script en Ubuntu que lea ese fichero y, si el contenido es correcto, envíe a Proxmox la orden remota de apagado en 10 minutos.

Ejecuta en Ubuntu Server:

  • sudo nano /usr/local/sbin/hermes-control-apagado-proxmox.sh

Contenido:

#!/bin/bash
SOLICITUD="/home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt"
SSH_KEY="/home/madiazg/.ssh/hermes_proxmox_shutdown"
PROXMOX_HOST="192.168.1.20"
if [ ! -f "$SOLICITUD" ]; then
    exit 0
fi
CONTENIDO="$(cat "$SOLICITUD" | tr -d '\r\n')"
if [ "$CONTENIDO" = "apagar_proxmox_10min" ]; then
    rm -f "$SOLICITUD"
    /usr/bin/ssh -i "$SSH_KEY" root@"$PROXMOX_HOST" "shutdown -h +10"
fi

Después guarda el fichero, y ejecuta:

  • sudo chmod 700 /usr/local/sbin/hermes-control-apagado-proxmox.sh
  • sudo chown root:root /usr/local/sbin/hermes-control-apagado-proxmox.sh

Sin salida

Perfecto, sin salida es correcto para esos comandos.Eso significa que el script ya existe y tiene permisos restringidos.

Paso 15: probar el script manualmente

Como ya habíamos creado el fichero:

/home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt

con este contenido:

apagar_proxmox_10min

ahora vamos a ejecutar el script manualmente desde Ubuntu Server:

  • sudo /usr/local/sbin/hermes-control-apagado-proxmox.sh

Esto debería programar el apagado de Proxmox dentro de 10 minutos.

The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.20' (ED25519) to the list of known hosts.
Shutdown scheduled for Thu 2026-06-04 20:08:49 WEST, use 'shutdown -c' to cancel.

Perfecto. Ha funcionado: el script ha leído la solicitud y ha programado el apagado de Proxmox.

Además, ese aviso de autenticidad ha salido porque esta vez el script se ha ejecutado con sudo, es decir, como root en Ubuntu, y el usuario root aún no tenía registrada la clave del host Proxmox en su known_hosts. Ya ha quedado aceptada.

Paso 16: cancelar el apagado programado de Proxmox

Ahora cancélalo desde Ubuntu Server ejecutando:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "shutdown -c"

Sin salida

Perfecto. De nuevo, sin salida es normal al cancelar con shutdown -c.

Ya tenemos validado:

  • Script manual de Proxmox: funciona
  • Programación de apagado remoto: funciona
  • Cancelación de apagado remoto: funciona

Además, el aviso de autenticidad SSH para root de Ubuntu ya quedó resuelto al responder yes.

Paso 17: recrear la solicitud para la prueba final del script

Como el script borra el fichero de solicitud al procesarlo, vamos a crearlo otra vez.

Ejecuta en Ubuntu Server:

  • echo "apagar_proxmox_10min" > /home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt

Después comprueba:

  • cat /home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt

apagar_proxmox_10min

Paso 18: crear el servicio systemd para Proxmox

Ahora vamos a crear el servicio que ejecutará el script de control.

Ejecuta en Ubuntu Server:

  • sudo nano /etc/systemd/system/hermes-control-apagado-proxmox.service

Contenido:

[Unit]
Description=Control de apagado de Proxmox solicitado por Hermes
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/hermes-control-apagado-proxmox.shç


Guarda el fichero y sal de nano.

Paso 19: crear el timer systemd para Proxmox

Ahora vamos a crear el timer que revisará periódicamente si existe una solicitud de apagado de Proxmox.

Ejecuta en Ubuntu Server:

  • sudo nano /etc/systemd/system/hermes-control-apagado-proxmox.timer
Contenido:

[Unit]
Description=Revisa solicitudes de apagado de Proxmox solicitadas por Hermes cada minuto

[Timer]
OnBootSec=30
OnUnitActiveSec=60
Unit=hermes-control-apagado-proxmox.service

[Install]
WantedBy=timers.target

Guarda el fichero y sal de nano.

Paso 20: activar el servicio y el timer

Ahora ejecuta en Ubuntu Server:

  • sudo systemctl daemon-reload
  • sudo systemctl enable --now hermes-control-apagado-proxmox.timer

Después comprueba que el timer está activo:

  • systemctl status hermes-control-apagado-proxmox.timer


Perfecto. El timer está correctamente activo:

Active: active (waiting)
Trigger: ... 41s left
Triggers: hermes-control-apagado-proxmox.service

Eso significa que systemd está esperando al próximo disparo para ejecutar el servicio.

Pulsa q para salir.

Paso 21: esperar a que el timer procese la solicitud

Como ya teníamos creado el fichero:

/home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt

con:

apagar_proxmox_10min

espera aproximadamente 1 minuto.

Debería programarse el apagado de Proxmox para dentro de 10 minutos. 

Después ejecuta en Ubuntu Server:

  • journalctl -u hermes-control-apagado-proxmox.service -n 30 --no-pager


En el log se ve esta línea clave:

Shutdown scheduled for Thu 2026-06-04 20:30:04 WEST, use 'shutdown -c' to cancel.

Eso confirma que el servicio systemd ha ejecutado el script y el script ha programado el apagado de Proxmox.

Paso 22: cancelar el apagado de Proxmox

Cancélalo ahora desde Ubuntu Server:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "shutdown -c"

Sin salida

Ya tenemos validado también el flujo por systemd:

Hermes/Ubuntu crea solicitud

timer systemd ejecuta el servicio

servicio lanza el script

script envía orden SSH a Proxmox

Proxmox programa su apagado

apagado remoto cancelable correctamente

Paso 23: recrear la solicitud para probarlo desde Hermes

Como el script borra el fichero al procesarlo, ahora vamos a dejarlo listo para probar que Hermes puede crear la solicitud.

El siguiente paso será enviarle a Hermes un prompt para que cree este fichero:

/home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt

con este contenido:

apagar_proxmox_10min

Luego el timer lo detectará y programará el apagado de Proxmox en 10 minutos.

Usa este prompt en Hermes:

Solicita el apagado controlado del homelab.

No ejecutes shutdown, reboot, poweroff ni halt directamente.
No ejecutes comandos SSH.
No intentes apagar Proxmox directamente.
Debes crear únicamente estos dos ficheros de solicitud, usando los mecanismos controlados ya configurados:
1) Solicitud de apagado de Ubuntu Server:
Ruta:
/home/madiazg/Hermes/control/solicitud_apagado.txt
Contenido exacto:
apagar_ubuntu_1min
2) Solicitud de apagado de Proxmox:
Ruta:
/home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt
Contenido exacto:
apagar_proxmox_10min
El objetivo es que Ubuntu Server se apague primero y que Proxmox quede programado para apagarse después.
No modifiques ningún otro fichero.
No ejecutes ninguna orden adicional.
Después informa únicamente de:
- si se ha creado correctamente la solicitud de apagado de Ubuntu
- ruta del fichero de Ubuntu
- contenido escrito en el fichero de Ubuntu
- si se ha creado correctamente la solicitud de apagado de Proxmox
- ruta del fichero de Proxmox
- contenido escrito en el fichero de Proxmox

Después, los timers deberían hacer esto:

  • Ubuntu → apagado en 1 minuto
  • Proxmox → apagado en 10 minutos

Para cancelar Proxmox antes de que se apague:

  • ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "shutdown -c"


Perfecto. Hermes ha hecho exactamente lo que queríamos:

Solicitud Ubuntu: creada correctamente

  • /home/madiazg/Hermes/control/solicitud_apagado.txt
  • apagar_ubuntu_1min

Solicitud Proxmox: creada correctamente

  • /home/madiazg/Hermes/control/solicitud_apagado_proxmox.txt
  • apagar_proxmox_10min

Ahora deberían actuar los dos timer de systemd:

  • Ubuntu Server → apagado en 1 minuto
  • Proxmox → apagado en 10 minutos

Para cancelar solo el apagado de Proxmox, si todavía estás a tiempo:

ssh -i ~/.ssh/hermes_proxmox_shutdown root@192.168.1.20 "shutdown -c"

Y para cancelar el apagado de Ubuntu, si aún no se ha apagado:

sudo shutdown -c

El flujo completo ya queda validado: Hermes solicita ambos apagados sin ejecutar shutdown directamente.

Unos segundos más tarde se ha apagado el servidor de ubuntu:

Al cabo de unos minutos proxmox se ha apagado correctamente.

Conclusiones finales

Con esta segunda parte hemos completado el objetivo: Hermes ya puede solicitar el apagado completo del homelab de forma controlada, apagando primero la máquina virtual Ubuntu Server y después el host Proxmox.

La gran ventaja de esta solución es que no hemos tenido que modificar la seguridad interna de Hermes ni forzar al agente a ejecutar comandos bloqueados. En lugar de intentar saltarnos esa protección, hemos creado un mecanismo externo, sencillo y auditable.

Este pequeño proyecto demuestra una forma muy interesante de integrar Hermes con tareas reales de administración del sistema sin darle control absoluto sobre la infraestructura. No se trata de que Hermes tenga acceso libre al servidor, sino de crear acciones concretas, limitadas y controladas que el sistema puede ejecutar de forma segura.

Una solución sencilla, elegante y suficientemente segura para automatizar el apagado de un entorno Proxmox + Ubuntu Server dentro de un homelab.


No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.