
🌐 También en: English · Deutsch · Français
A estas alturas, mi pequeño homelab se ha convertido en una flota de máquinas virtuales pequeña pero matona: casi una docena de ellas funcionan a pleno rendimiento. Pero más servicios significan más logs… y más caos. 🌀
Para poner orden en ese caos, uso el log shipper de código abierto Fluent Bit, que recoge los logs de todas mis VM y los envía a una instancia centralizada de OpenSearch para analizarlos y visualizarlos.
¿El objetivo? Recogerlo todo: desde avisos de espacio en disco, intentos de inicio de sesión fallidos y el ruido de systemd hasta jugosos mensajes del kernel. Todos los logs de todas mis máquinas deben acabar bien indexados y consultables en un único panel de OpenSearch.
(Pronto te explicaré la instalación de OpenSearch en un artículo aparte.)
Ahora bien, en lugar de entrar en cada VM y configurar Fluent Bit a mano (no, gracias 🙃), he creado un playbook de Ansible pequeño y ordenado que automatiza toda la instalación.
Esto es lo que hace el playbook:
- Instala Fluent Bit
- Sube un archivo de configuración propio desde el directorio local
files/ - Se asegura de que el servicio esté iniciado y habilitado
Con el playbook listo, puedo desplegar Fluent Bit en todas las VM a la vez, en paralelo, sin ningún trabajo manual. Un solo comando y Ansible se encarga del resto.
Una de las mejores cosas de Ansible es su idempotencia: comprueba con inteligencia el estado de cada sistema de destino y solo ejecuta las tareas realmente necesarias. Puedes lanzar el playbook tantas veces como quieras sin romper nada, y eso es pura magia DevOps. ✨
Para que esto funcione hace falta un archivo más: un inventario hosts.ini, que enumera las direcciones IP de todas mis VM e indica cómo debe conectarse Ansible a ellas por SSH.
--- # Ansible Playbook to install Fluent Bit
- name: Install packages and configure Fluent Bit on Debian 12
hosts: homelab
become: true
vars:
fluentbit_custom_config: true # Set to true to upload your own config file from "files/"
tasks:
- name: Ensure gpg is installed
ansible.builtin.apt:
name: gnupg
state: present
update_cache: yes
- name: Import Fluent Bit GPG key
ansible.builtin.apt_key:
url: https://packages.fluentbit.io/fluentbit.key
keyring: /usr/share/keyrings/fluentbit-archive-keyring.gpg
state: present
- name: Add Fluent Bit repository
ansible.builtin.apt_repository:
repo: deb [signed-by=/usr/share/keyrings/fluentbit-archive-keyring.gpg] https://packages.fluentbit.io/debian/bookworm bookworm main
filename: fluentbit
state: present
- name: Update apt cache
ansible.builtin.apt:
update_cache: yes
- name: Install Fluent Bit
ansible.builtin.apt:
name: fluent-bit
state: present
- name: Optional - Deploy custom fluent-bit.conf from files/
ansible.builtin.copy:
src: fluent-bit.conf
dest: /etc/fluent-bit/fluent-bit.conf
owner: root
group: root
mode: '0644'
notify: Restart fluent-bit
when: fluentbit_custom_config | default(false)
- name: Enable and start Fluent Bit service
ansible.builtin.systemd:
name: fluent-bit
enabled: yes
state: started
handlers:
- name: Restart fluent-bit
ansible.builtin.systemd:
name: fluent-bit
state: restarted
Aquí tienes una salida de ejemplo tras ejecutar el playbook. Como ves, todo fue como la seda, salvo en pihole, donde al principio faltaba gpg, lo que hizo que la primera instalación fallara en parte. Después de instalar gpg, el playbook se ejecutó sin problemas:
root@seedVM:~/ansible/fluent-bit# ansible-playbook install_and_configure.yml -i hosts.ini
PLAY [Install packages and configure Fluent Bit on Debian 12] ************************************************
TASK [Gathering Facts] ***************************************************************************************
ok: [pihole]
ok: [gitlab]
...
TASK [Install Fluent Bit] ************************************************************************************
ok: [gitlab]
ok: [grafana]
changed: [pihole]
...
TASK [Enable and start Fluent Bit service] *******************************************************************
ok: [nextcloud]
changed: [pihole]
...
RUNNING HANDLER [Restart fluent-bit] *************************************************************************
changed: [pihole]
PLAY RECAP ****************************************************************************************************
blog : ok=8 changed=0 unreachable=0 failed=0
pihole : ok=9 changed=7 unreachable=0 failed=0
seedVM : ok=8 changed=0 unreachable=0 failed=0





