Automatizando el despliegue y configuración de un stack ELK completo con Ansible

Automatizando el despliegue y configuración de un stack ELK completo con Ansible

¿Te gustaría desplegar un entorno ELK (Elasticsearch, Logstash y Kibana) en varias máquinas Linux de forma automatizada y reproducible? Hoy te traigo un playbook de Ansible que orquesta todo: instalación, configuración de servicios y puesta en marcha, listo para explotar logs en minutos. Es un ejemplo de cómo Ansible brilla organizando infraestructura compleja con mínima intervención manual e ideal para entornos de monitorización, análisis de logs o para jugar en tu laboratorio.

¿Por qué automatizar el ELK stack con Ansible?

  • Reproducibilidad: Olvídate de seguir pasos manuales. Todo fluirá igual en entornos desarrollo, preproducción y producción.
  • Idempotencia: Si el playbook se vuelve a ejecutar, asegura que nada quede duplicado ni mal configurado[5].
  • Escalabilidad: Añadir nuevos nodos o escalar el clúster es trivial, solo sumando IPs al inventario.
  • Mantenibilidad: Cualquier cambio o actualización se aplica automáticamente en todos los nodos[2][3].
  • Ahorro de tiempo y errores: Automatiza las tareas repetitivas y propensas a fallos humanos.

El playbook completo: despliegue de Elasticsearch, Logstash y Kibana

Este ejemplo asume al menos tres hosts (uno para cada servicio, aunque puedes ajustar según tus necesidades). Puedes usar el inventario de Ansible adaptándolo a tus nodos (por ejemplo, elk-elasticsearch, elk-logstash, elk-kibana).


---
- name: Despliegue automatizado de ELK stack con Ansible
  hosts: elk
  become: true
  vars:
    elastic_version: "8.14.0"
    es_service_name: elasticsearch
    logstash_service_name: logstash
    kibana_service_name: kibana
    elk_repo_url: "https://artifacts.elastic.co/packages/{{ elastic_version }}/apt"
    elasticsearch_conf_dir: /etc/elasticsearch
    kibana_conf_dir: /etc/kibana
    logstash_conf_dir: /etc/logstash

  tasks:
    - name: Añadir clave GPG de Elastic
      apt_key:
        url: "{{ elk_repo_url }}/gpg"
        state: present

    - name: Añadir repositorio de Elastic
      apt_repository:
        repo: "deb {{ elk_repo_url }} stable main"
        state: present

    - name: Actualizar cache APT
      apt:
        update_cache: yes

    - name: Instalar Elasticsearch
      apt:
        name: "elasticsearch={{ elastic_version }}"
        state: present
      when: "'elk-elasticsearch' in group_names"

    - name: Instalar Logstash
      apt:
        name: "logstash={{ elastic_version }}"
        state: present
      when: "'elk-logstash' in group_names"

    - name: Instalar Kibana
      apt:
        name: "kibana={{ elastic_version }}"
        state: present
      when: "'elk-kibana' in group_names"

    - name: Copiar configuración personalizada de Elasticsearch
      template:
        src: templates/elasticsearch.yml.j2
        dest: "{{ elasticsearch_conf_dir }}/elasticsearch.yml"
        owner: root
        group: elasticsearch
        mode: '0640'
      when: "'elk-elasticsearch' in group_names"

    - name: Copiar configuración personalizada de Kibana
      template:
        src: templates/kibana.yml.j2
        dest: "{{ kibana_conf_dir }}/kibana.yml"
        owner: root
        group: kibana
        mode: '0640'
      when: "'elk-kibana' in group_names"

    - name: Copiar configuración personalizada de Logstash
      template:
        src: templates/logstash.conf.j2
        dest: "{{ logstash_conf_dir }}/conf.d/logstash.conf"
        owner: root
        group: logstash
        mode: '0640'
      when: "'elk-logstash' in group_names"

    - name: Habilitar y arrancar Elasticsearch
      systemd:
        name: "{{ es_service_name }}"
        state: started
        enabled: yes
      when: "'elk-elasticsearch' in group_names"

    - name: Habilitar y arrancar Logstash
      systemd:
        name: "{{ logstash_service_name }}"
        state: started
        enabled: yes
      when: "'elk-logstash' in group_names"

    - name: Habilitar y arrancar Kibana
      systemd:
        name: "{{ kibana_service_name }}"
        state: started
        enabled: yes
      when: "'elk-kibana' in group_names"
  

Algunos detalles y consejos extra

  • Personaliza la configuración: Usa plantillas Jinja2 para cada servicio y adáptalas a tu entorno (IP/puertos, usuarios, contraseñas[3][4]). Si necesitas ejemplos de .j2, dímelo y los incluyo en próximos posts.
  • Segmenta el inventario: Organiza elk-elasticsearch, elk-logstash y elk-kibana como grupos, para facilitar despliegues distribuidos.
  • Mantén la seguridad: No subas contraseñas ni datos sensibles en el playbook. Usa Ansible Vault o variables protegidas[2][3].
  • Aplica buenas prácticas: Mantén tus roles, plantillas, inventories y variables bien organizados. Ganarás en mantenibilidad cuando el proyecto crezca[2][3].

¿Problemas frecuentes?

  • Errores de dependencias: Si ves fallos con paquetes, asegúrate de usar la versión de repo acorde al SO y versión de los nodos.
  • Servicios no arrancan: Revisa logs en /var/log/elasticsearch/, /var/log/logstash/ y /var/log/kibana/. Suele ser algún parámetro de configuración o falta de memoria.
  • Firewall: Verifica que los puertos (9200 Elasticsearch, 5601 Kibana, 5044 Logstash) están abiertos entre nodos.

¿Quieres otro playbook que extienda esta solución? ¿Quizá una recopilación de dashboards útiles? ¡Déjalo en los comentarios, siempre busco ideas nuevas para automatizar!

Avatar

Por Mid