En este tutorial se detalla paso a paso cómo centralizar y automatizar el respaldo de los archivos de configuración críticos de un clúster de Proxmox VE y de un servidor Proxmox Backup Server (PBS). Mediante el uso de Ansible Semaphore, se recolectarán de forma periódica las estructuras de metadatos, configuraciones de red y planificaciones de replicación de los nodos, almacenándolas en un repositorio persistente. Finalmente, el sistema generará un reporte dinámico en formato HTML con un manual interactivo de recuperación ante desastres y lo enviará automáticamente por correo electrónico para garantizar la resiliencia del CPD.

1. Requisitos previos y preparación del entorno

Para llevar a cabo la automatización de copias de seguridad de configuración de Proxmox VE y PBS, es necesario contar con la siguiente infraestructura:

  • Un clúster de Proxmox VE operativo (en este escenario, compuesto por tres nodos: n1, n2 y n3). En el siguiente enlace indicamos cómo desplegar un clúster Proxmox VE: Crear un clúster de virtualización con Proxmox VE.
  • Un servidor Proxmox Backup Server (PBS) integrado o coexistiendo en uno de los nodos (en este escenario, configurado en el nodo n3). En el siguiente enlace explicamos cómo desplegar un servidor PBS sobre un nodo Proxmox VE: Servidor de Backup Proxmox (PBS) sobre ZFS.
  • Una instancia de Ansible Semaphore desplegada mediante Docker. En el siguiente enlace explicamos cómo desplegar Ansible en Linux doquerizado: Despliegue de Ansible y Semaphore para automatización de tareas.
  • Una cuenta de correo electrónico con soporte SMTP activo (por ejemplo, una cuenta de Gmail con una Contraseña de Aplicación generada para el envío seguro a través del puerto 587 con STARTTLS).

A nivel de red, el contenedor de Semaphore debe tener acceso libre en el cortafuegos (por ejemplo, OPNsense) para comunicarse con los nodos Proxmox, así como resolución DNS externa directa hacia internet (servidores como 8.8.8.8) para interactuar con las API de mensajería o servidores de correo.

NOTA IMPORTANTE: en la copia de seguridad que se va a automatizar en este tutorial NO se realizan copias de las máquinas virtuales de Proxmox, únicamente de las configuraciones de los nodos y el PBS. Las copias de las máquinas virtuales deben realizarse con Proxmox Backup Server (PBS), como indicamos en este tutorial:

2. Configuración de variables en Ansible Semaphore

Para evitar exponer credenciales en texto plano dentro del código, se deben dar de alta las siguientes variables, en ANsible Semaphore, desde «Grupos de variables» – «Nuevo grupo»:

Añadiremos estas variables:

3. Docker Compose de Ansible para mapeo que unidad de playbooks y otras configuraciones

En el siguiente tutorial explicamos cómo desplegar Ansible/Semaphore en docker con Linux:

Aún así, mostramos aquí el docker-compose.yml para desplegar Ansible con mapeo a carpetas del anfitrión, para tenerlas disponibles tanto fuera como dentro del contenedor:

Sobre todo, estamos mapeando:

  - ./playbooks:/playbooks
  - ./config:/etc/semaphore
  - /backups_proxmox:/var/backups_proxmox

De forma que los backups que se realizarán en cada nodo del clúster Proxmox, se almacenarán en el equipo Ansible anfitrión, en la carpeta /backups_proxmox. Y los playbooks se guardarán en /playbooks (dentro de donde se ejecuta el docker-compose.yml). Por ello, en el siguiente punto, guardaremos el fichero recuperacion_proxmox_pbs.html en /playbooks del equipo anfitrión, para que, mediante el mapeo, Ansible del contenedor docker lo cogerá para enviarlo adjunto al email.

Si hemos modificado el docker-compose.yml, podremos volver a desplegar el contenedor, ejecutando, en la carpeta donde esté el fichero docker-compose.yml:

Nota: estos comandos NO eliminan datos en los contenedores, si teníamos configurada correctamente la persistencia, se detendrán los contenedores referenciados en el doccker-compose.yml y se volverán a regenerar, tomando los datos de la persistencia ya establecida anteriormente.

4. Manual HTML de recuperación ante desastres (recuperacion_proxmox_pbs.html)

Crearemos un fichero en el servidor Ansible en formato HTML, sobre los pasos para realizar una posible recuperación ante desastres, barajando varios escenarios (avería de un nodo, avería de todos los nodos y el clúster, avería del PBS). Este fichero debe ubicarse de en la ruta donde se encuentren los playbooks del servidor anfitrión de Ansible (por ejemplo /home/ansible/semaphore/playbooks/recuperacion_proxmox_pbs.html). Al estar mapeado como volumen en el contenedor de Semaphore, estará disponible para ser adjuntado en los correos salientes.

Crearemos el fichero recuperacion_proxmox_pbs.html en la carpeta de los playbooks del servidor de Ansible:

Cambiaremos la carpeta /home/ansible/semaphore/playbooks por la que tengamos en nuestro servidor Ansible.

Con el siguiente contenido:

Evidentemente, adaptaremos el fichero HTML a la información y características de nuestro entorno. Es un HTML estático, por lo que hay que modificarlo y adaptarlo de forma manual.

5. Inventario de nodos Proxmox en Ansible/Semaphore

Dado que para este caso vamos a realizar conexión SSH desde Ansible a los nodos Proxmox, y NO vamos a usar el API de Proxmox, necesitaremos definir inventario de nodos en Semaphore. Desde «Inventario» – «Nuevo inventario» – «Ansible Inventory»:

Estableceremos el nombre servidores_proxmox para este inventario, esto es importante, porque en el playbook indicaremos este nombre en hosts. Añadiremos el siguiente INI (modificando las IP y nodos Proxmox por las de nuestra organización):

Estableceremos el usuario con el que realizamos la conexión SSH, como indicamos en este tutorial:

6. El Playbook de Ansible para automatizar el backup Proxmox y envío de email

Crearemos el playbook que realizará todas las tareas en cada nodo Proxmox, desde Ansible: playbook backup_proxmox_pbs.yml. Crearemos el fichero del playbook en el servidor de Ansible:

Cambiaremos la carpeta /home/ansible/semaphore/playbooks por la que tengamos en nuestro servidor Ansible.

El contenido del playbook será:

Consideraciones importantes para la adaptación del Playbook

Antes de ejecutar este playbook en producción, hay que revisar y adaptar ciertos parámetros para asegurar su compatibilidad con la infraestructura de cada organización:

  • Identificación del Inventario (hosts): En la cabecera del playbook se define hosts: servidores_proxmox. Este valor debe coincidir exactamente con el nombre del inventario lógico creado dentro de Ansible Semaphore que agrupa a los nodos del clúster.
  • Ruta de almacenamiento local (base_local_path): La variable /var/backups_proxmox apunta al directorio interno del contenedor de Semaphore. Hay que verificar que esta ruta esté correctamente mapeada en el docker-compose.yml contra un volumen persistente o un disco externo del servidor anfitrión.
  • Fichero de registro (local_log_file): La variable /playbooks/backup_proxmox_ejecucion.log escribe un histórico de auditoría. Se debe asegurar que el usuario que ejecuta Semaphore tenga permisos de escritura en la carpeta de playbooks para evitar fallos de denegación de acceso.
  • Filtros por Hostname (when): En las tareas dedicadas a Proxmox Backup Server, se incluye la condicional when: ansible_facts['hostname'] == 'n3'. Si el servicio PBS está desplegado en un nodo con otro nombre, se debe sustituir 'n3' por el hostname correspondiente.

Análisis detallado de las tareas del Playbook

A continuación, se desglosa el comportamiento técnico de cada una de las tareas automatizadas en este script de Ansible:

  • 0. Asegurar dependencias de Python: Esta tarea se ejecuta en el localhost (el propio contenedor de Semaphore) una única vez (run_once: true). Utiliza el gestor de paquetes pip apuntando al intérprete exacto de Ansible (ansible_playbook_python) para instalar proxmoxer y requests. De este modo, se garantiza que cualquier otro playbook del entorno que use la API de Proxmox disponga de las librerías necesarias, resolviendo además problemas de inicialización de submódulos de Python.
  • 1. Crear el archivo de backup de Proxmox VE (PVE): Se ejecuta de forma remota en todos los nodos del clúster. Utiliza el módulo community.general.archive para empaquetar de manera agnóstica el directorio /etc/pve (el sistema de archivos virtual en clúster pmxcfs), el fichero de configuración de interfaces de red (/etc/network/interfaces) y la tabla de montaje de discos (/etc/fstab). El resultado se comprime en un único archivo .tar.gz temporal en la ruta /tmp/ del nodo.
  • 2. Crear el archivo de backup de PBS (nodo n3): Actúa exclusivamente en el servidor que cumple la condición de hostname (n3). Comprime la estructura de configuración del servidor de copias de seguridad (/etc/proxmox-backup) y los metadatos de propiedad de los almacenes (/var/lib/proxmox-backup/chown), empaquetándolo en otro archivo temporal .tar.gz.
  • 3. Asegurar directorio local en el volumen del contenedor Ansible: Delegada al localhost, esta tarea verifica la estructura del almacenamiento persistente del servidor de automatización Ansible. Crea una carpeta cronológica utilizando el hostname del nodo y la fecha actual del sistema (ej. n1_2026-07-02), asignándole permisos (0777) para evitar conflictos de bloqueo de archivos.
  • 4. Descargar el backup de PVE al servidor Ansible: Utiliza el módulo fetch de Ansible para transferir el archivo /tmp/pve-config-backup.tar.gz desde cada uno de los nodos del clúster hacia la carpeta recién creada en el almacenamiento centralizado del servidor Ansible.
  • 5. Descargar el backup de PBS al servidor Ansible (nodo n3): Realiza la misma operación de descarga que la tarea anterior, pero recuperando el archivo comprimido con las configuraciones del Proxmox Backup Server ubicado en el nodo configurado.
  • 6. Limpiar archivos temporales de los nodos remotos: Una vez que los archivos comprimidos han sido descargados con éxito en el servidor Ansible, esta tarea elimina los archivos .tar.gz residuales de la carpeta /tmp/ de cada nodo remoto, asegurando que no se consuma espacio innecesario en los discos de los hipervisores.
  • Registrar estado de la ejecución en log local: Escribe una línea de texto formateada con la fecha, hora y estado de la ejecución dentro del archivo log del volumen permanente (backup_proxmox_ejecucion.log). Esto permite llevar un control histórico e identificar rápidamente si un nodo ha dejado de reportar sus copias de seguridad.
  • 7. Enviar email de reporte con fichero HTML adjunto: Esta tarea final se ejecuta una sola vez en el localhost. Recopila las variables SMTP insertadas en Semaphore, establece un canal seguro mediante starttls, define la codificación de caracteres en utf-8 para soportar textos enriquecidos y genera un correo con formato HTML estructurado que incluye la tabla de estado de las copias de seguridad. Además, localiza en el volumen el manual técnico recuperacion_proxmox_pbs.html y lo envía adjunto.

7. Creación y ejecución de la tarea periódica

Para automatizar la ejecución del proceso en entornos de producción, seguiremos los siguientes pasos desde la interfaz Ansible/Semaphore:

  • En el panel de control Semaphore, pulsaremos en Plantillas de Tareas y en «Nueva plantilla» – «Ansible Playbook»:
  • Introduciremos los siguientes datos en la plantilla:
  • Nombre: backup_proxmox_pbs.
  • Ruta al archivo de playbook: playbook backup_proxmox_pbs.yml.
  • Inventario: sevidores_proxmox.
  • Repositorio: Local.
  • Grupos de Variables: servidor_email.

    Realizaremos una primera prueba de ejecución de la tarea:

    Se ejecutará la tarea y mostrará el resultado:

    Habrá enviado un email con el resultado de la copia de seguridad:

    Dicho correo electrónico contendrá, además, un fichero adjunto en formato HTML con los pasos e instrucciones para una posible recuperación del sistema:

    Cuando hayamos revisado que la tarea funciona perfectamente, añadiremos la programación oportuna para que se ejecute cada cierto tiempo, por ejemplo cada dos días: