Introducción

Como comenté en el post anterior, empecé a implementar Ansible en mi homelab como siguiente paso después de tener todo containerizado con Docker. Ansible es una herramienta que automatiza la configuración de servidores, el despliegue de programas y la gestión de redes sin necesidad de instalar agentes externos en los equipos controlados. Además, ayuda a monitorizar los servidores que tengas: actualizaciones, versiones, estado general... En este post te cuento cómo lo monté desde cero.

¿Por qué Semaphore?

Para no manejar todo desde la CLI de Ansible, decidí aprovechar el App Store que ofrece ZimaOS e instalar Ansible Semaphore, una capa visual sobre Ansible CLI que permite gestionar todo cómodamente vía web en lugar de estar todo el rato en terminal, pero tu puedes hacer lo mismo creando un Docker Compose.

Instalación

  1. Instalar Semaphore desde el App Store de ZimaOS o usando un Docker Compose. Aquí tienes la documentación https://semaphoreui.com/docs/admin-guide/installation/docker
  2. Configurar el puerto — en mi caso tenía el 3000 ocupado, así que usé el 3030.
  3. Configurar usuario y contraseña. Si tu servidor está expuesto al exterior, te recomiendo no dejarlos por defecto por seguridad; si es solo de uso interno, puedes dejarlos así. Este usuario se configura desde el compose.yml.
  4. Acceder a la web y hacer login.

Crear el proyecto

Lo primero dentro de Semaphore es crear un proyecto con el nombre que quieras. En mi caso lo llamé simplemente Homelab.

Configurar las Keys SSH

Ansible se conecta por SSH a los servidores que le indiques y lanza los playbooks ahí, así que lo primero es configurar las keys. Necesitas dos tipos:

  • Key SSH, para la conexión al servidor — hice la primera prueba conectando con mi Raspberry Pi 5.
  • Key de sudo, para la autenticación, ya que la mayoría de operaciones la necesitan (simplemente se añade la contraseña).

Configurar el repositorio de playbooks

Aquí tienes dos opciones: almacenar los playbooks localmente o usar un repositorio Git. Yo opté por un repo privado en GitHub por redundancia. Los pasos:

  1. Generar una key SSH dedicada en la máquina donde corre Semaphore:
ssh-keygen -t ed25519 -C "semaphore-homelab" -f ~/.ssh/semaphore_github -N ""
  1. Luego dentro de Github vas a tu perfil Settings -->SSH and GPG Keys --> New SSH key y añades la clave .pub que acabas de generar.
  2. Crear el repositorio en GitHub, esto como crearías cualquier repo normal solo que yo lo haría privado para que solo lo puedas ver y gestionar tu.
  3. Añadir esa key como credencial del repositorio dentro de Semaphore, aquí añades la clave privada creada anteriormente. Esto se crea desde Key Store
  1. Por ultimo añadir el repositorio a Ansible

Configurar el Inventory

En el inventory específicas la IP y a qué host se tiene que conectar Ansible — en mi caso, mi Raspberry Pi

Crear el primer playbook

Para probar que todo funcionaba, creé un playbook sencillo que simplemente ejecuta un apt update :

---
- name: Actualizar repositorios APT
  hosts: raspberry
  become: yes
  tasks:
    - name: apt update
      apt:
        update_cache: yes

Como al principio configuré el repo como local, tuve que meterme en la terminal del propio contenedor y crear el archivo directamente con un heredoc:

cat > apt-update.yml << 'EOF'
---
- name: Actualizar repositorios APT
  hosts: raspberry
  become: yes
  tasks:
    - name: apt update
      apt:
        update_cache: yes
EOF

Una vez pasé a usar el repositorio en GitHub, esto se simplifica mucho: creas el playbook desde tu propio equipo, con tu editor de siempre, y simplemente haces push de los cambios. Así que este paso anterior es opcional.

Crear la Task Template

El último paso es unir todo lo anterior — repositorio, inventory, playbook y credenciales — en una Task Template dentro de Semaphore, este ya es el paso final pero es necesario tener todos los pasos anteriores bien y terminados.

Si usas el repo de Github solo te tienes que fijar en el repository en vez de usar Local usarias Playbooks en mi caso.

Ejecutar y verificar

Con la Task Template creada, ya puedes lanzar la ejecución y comprobar que el resultado es el esperado.

Programar ejecuciones periódicas (opcional)

Si quieres que la ejecución sea periódica, puedes añadirle un schedule a la Task Template. Es opcional, pero es justo lo que le da sentido a automatizar esto: que se ejecute solo, sin que tengas que acordarte tú.

Conclusión y próximos pasos

Con esto ya tienes un ejemplo rápido de lo que se puede hacer con Semaphore y Ansible — y las posibilidades son prácticamente infinitas. Mi idea ahora es ampliar la cobertura hasta tener un mantenimiento semanal programado en toda la infraestructura, y ya estoy trabajando en playbooks más específicos, como uno que monta un recurso compartido CIFS y reinicia un contenedor Docker en la Raspberry Pi bajo demanda, pasando las credenciales de forma segura mediante variables de Semaphore en lugar de un fichero de credenciales.

Ese playbook más avanzado te lo cuento en el próximo post.