Infraestructura doméstica con Ansible

Hola de nuevo, como véis, con el nuevo tema elegido para el blog, la sorpresa sobre la canción elegida se desvela nada más visitar la página principal o, si vienes desde el RSS Feed, nada más visualizar el post, pero leedlo hasta el final que seguro que es interesante.

Después del tema de la VPN con WireGuard y la intervención de mi otro colega de Blog, que también quería sumarse a la fiesta de reapertura y como reza el título de la canción, vamos a bailar. Como os comenté en el primer post de la nueva época tenía pendiente la publicación de los playbooks y roles que utilizo para desplegar mi infraestructura de casa y ya está disponible en GitHub. Por ahora sólo aparecen los servidores básicos, el dhcp, articulado por el servicio dnsmasq, los dos servidores de nombres, alimentados por bind y, por supuesto, Zabbix, soportado por un haproxy, el servidor web que ejecuta el código del frontend, PHP en este caso, y un servidor PostgreSQL.

Espero ir actualizando los roles con todos los servidores que vaya migrando a la nueva versión de Ubuntu LTS ya que lo tenía todo un poco abandonado. La joya de la corona, mi NextCloud personal, no lo tengo bajo los roles de Ansible pero igual en un futuro me animo a añadirlo. De momento vamos a centrarnos en lo que ya tenemos y sobre todo en cómo crear los contenedores.

Como ya habréis leído en algún post anterior, mi preferencia para crear contenedores en casa pasa por LXD, el proyecto de Canonical para hacer más cómodo el manejo de los contenedores linux por excelencia, los lxc. Como ya he explicado alguna vez, los elegí porque los veía más cercanos a mi forma de trabajar, prefiero tener unos mini servidores que pueda administrar de la forma tradicional antes que otros más inmutables. He de decir que el proyecto se ha bifurcado ya que Canonical lo sacó del paraguas de linuxcontainers para alojar ellos toda la infraestructura y ahora tenemos dos proyectos entre los que elegir, Incus y el propio LXD.

Si inspeccionáis los roles que tengo publicados veréis que podremos configurar los servidores básicos, un dhcp, dos servidores de nombres internos, principal y réplica, un servidor de base de datos, por supuesto es PostgreSQL, un frontal, que en este caso es un HAProxy y algún servidor de middleware.

Si queréis reproducir esta infraestructura podéis consultar mi post sobre contenedores y empezar por crear los básicos, dhcp, dns1 y dns2. A estos tres en concreto les configuro una ip fija mediante netplan, otro proyecto de Canonical que permite la configuración de red mediante ficheros YAML. Las direcciones de estas tres máquinas las tengo asignadas como tal en las configuraciones de Ansible pero lo mejor es definirlas como fijas en la inicialiación de los contenedores. El servicio de dhcp, que en la máquina elegida es servido por dnsmasq, la tengo guardada tanto para un entorno de pruebas en local como para los contenedores que están funcionando en casa en estos momentos. Esta misma configuración la utilizo con unos roles de actualización de configuraciones y cuando cambio algún contenedor simplemente ejecuto los roles implicados y en caso de tener que regenera la infraestructura desde cero por un desastre, se recuperaría con el último estado y se debería usar de guía para preparar los nuevos contenedores.

La configuración de netplan es tan sencilla como muestro en el siguiente bloque:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
      - 192.168.1.xx/24
      gateway4: 192.168.1.x
      nameservers:
        addresses:
        - 127.0.0.1
        - 192.168.1.xx
        - 1.1.1.1
        search:
        - domain.local

En esta muestra le asignamos una ip al contenedor pero en los que crearemos para reproducir nuestra infraestructura tendremos la configuración por dhcp y se le asignará una fija dependiendo de su MAC concreta y previamente consignada en las variables principales del proyecto. Por cierto que netplan está lo suficientemente maduro como para configurar bridges, bondings y bastantes cosas más, pero para estos contenedores, los servidores de nombres y el propio servidor de dhcp nos bastará con lo básico.

Una vez que tenemos los contenedores creados desde cero con Ubuntu 24.04 LTS ya podríamos invocar los playbooks de Ansible. Lo que yo suelo hacer es crear snapshots de los mismos antes de las ejecuciones y además ir por bloques, quizás, dhcp, dns1 y dns2, después la base de datos y el frontal, aunque una vez testeados en local no habría problema en lanzarlos todos de golpe.

Por razones obvias he guardado en GitHub versiones ficticias de los ficheros YAML que contienen los secretos de los servidores así como las ips y MACs de los contenedores, con lo cuál, antes de lanzar los playbooks habría que ajustar todos estos detalles a los contenedores que hayáis creado en vuestro laboratorio. Hay más detalles en el fichero README.md del propio proyecto.

El playbook principal se llama hi-playbook.yml, las dos letras iniciales vienen de home infrastructure como ya habréis podido deducir. Desde él se pueden invocar el resto de playbooks y, dependiendo del entorno, debemos comentar el de pro o el de dev para utilizar las variables de uno u otro entorno y conectarnos a los servidores correctos.

También podría explicar pormenorizadamente cada uno de los roles pero siempre intento mostrar en los nombres de las tareas lo que se está haciendo, por lo que se explican bastante bien por sí sólos, además, no es más bonito sumergirse en el código para comprenderlo de verdad, sobre todo si es tan claro como Ansible o Python.

Sólo me gustaría apuntar que en el rol de PostgreSQL he añadido outputs de rendimiento con la instalación de fábrica y con la configuración aplicada para optimizarla dependiendo, sobre todo, de la memoria disponible en la infraestructura sobre la que estemos desplegando. En ese caso sí que os aconsejo que ajustéis estas variables para obtener el mejor rendimiento, sobre todo si vais a utilizar Zabbix con bastantes métricas. Cuando hablamos de bastantes métricas, evidentemente no hablamos de una instalación casera pero siempre es bueno tener una buena base para poder crecer, que luego es más complicado pelearse con reinicios obligados por falta de rendimiento.

Como ya habréis visto en el encabezado del post, he elegido la canción Let's Dance del grandérrimo David Bowie, de su álbum homónimo y la tenía seleccionada para la resurrección del blog, pero al final los cartageneros de Arde Bogotá se hicieron con ese honor.

Enjoy!