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!