Automatiza la Monitorización con Prometheus y Grafana: Playbook Completo de Ansible
La monitorización es la piedra angular de cualquier infraestructura moderna. Hoy te propongo un reto de nivel intermedio-alto: desplegar automáticamente Prometheus y Grafana en servidores Linux usando un único playbook de Ansible. ¿El objetivo? Poner en pie tu stack de monitorización, desde cero, de una manera sencilla y escalable.
¿Por qué automatizar la monitorización?
- Menos errores manuales: Un script reproducible siempre supera a la configuración a mano.
- Listo para escalar: Puedes añadir hosts o reinstalar desde cero sin perder tiempo.
- Compatible con GitOps/CI: Puedes versionar cambios y replicar despliegues.
Ni Prometheus ni Grafana requieren agentes pesados, siendo perfectos aliados de Ansible y respetando su filosofía agentless[1].
¿Qué hace el playbook?
- Instala Prometheus desde los binarios oficiales en los hosts de monitorización.
- Instala y configura Grafana como servicio.
- Crea systemd units y usuarios dedicados para mayor seguridad.
- Crea un dashboard inicial y conecta Grafana con Prometheus automáticamente.
- Tuneliza puertos opcionalmente para uso seguro en entornos cerrados.
Playbook .yml Completo
Asegúrate de tener definidos tus prometheus_servers
y grafana_servers
en el inventario de Ansible.
---
- name: Instala y configura Prometheus
hosts: prometheus_servers
become: true
vars:
prometheus_version: "2.51.2"
prometheus_user: prometheus
prometheus_dir: /opt/prometheus
prometheus_port: 9090
tasks:
- name: Crear usuario y grupo para Prometheus
ansible.builtin.user:
name: "{{ prometheus_user }}"
shell: /usr/sbin/nologin
- name: Descargar Prometheus
ansible.builtin.unarchive:
src: "https://github.com/prometheus/prometheus/releases/download/v{{ prometheus_version }}/prometheus-{{ prometheus_version }}.linux-amd64.tar.gz"
dest: "{{ prometheus_dir }}"
remote_src: yes
creates: "{{ prometheus_dir }}/prometheus-{{ prometheus_version }}.linux-amd64"
- name: Crear directorios de datos y configuración
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: "{{ prometheus_user }}"
group: "{{ prometheus_user }}"
mode: '0755'
loop:
- "{{ prometheus_dir }}/data"
- "{{ prometheus_dir }}/etc"
- name: Copiar archivo de configuración de Prometheus
ansible.builtin.copy:
dest: "{{ prometheus_dir }}/etc/prometheus.yml"
content: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
owner: "{{ prometheus_user }}"
group: "{{ prometheus_user }}"
mode: '0644'
- name: Crear systemd unit para Prometheus
ansible.builtin.copy:
dest: /etc/systemd/system/prometheus.service
content: |
[Unit]
Description=Prometheus
After=network.target
[Service]
User={{ prometheus_user }}
Group={{ prometheus_user }}
ExecStart={{ prometheus_dir }}/prometheus-{{ prometheus_version }}.linux-amd64/prometheus \
--config.file={{ prometheus_dir }}/etc/prometheus.yml \
--storage.tsdb.path={{ prometheus_dir }}/data
[Install]
WantedBy=multi-user.target
mode: '0644'
- name: Recargar systemd y arrancar Prometheus
ansible.builtin.systemd:
name: prometheus
state: started
enabled: true
daemon_reload: true
- name: Instala y configura Grafana
hosts: grafana_servers
become: true
tasks:
- name: Añadir repositorio oficial de Grafana
ansible.builtin.apt_repository:
repo: "deb https://packages.grafana.com/oss/deb stable main"
state: present
- name: Importar clave GPG de Grafana
ansible.builtin.apt_key:
url: "https://packages.grafana.com/gpg.key"
state: present
- name: Instalar Grafana
ansible.builtin.apt:
name: grafana
state: latest
update_cache: true
- name: Arrancar y habilitar Grafana
ansible.builtin.systemd:
name: grafana-server
state: started
enabled: true
- name: Esperar a que Grafana esté activo
ansible.builtin.wait_for:
port: 3000
state: started
timeout: 30
- name: Añadir Prometheus como datasource en Grafana vía API (por defecto sin autenticación)
uri:
url: "http://localhost:3000/api/datasources"
method: POST
body: |
{
"name":"Prometheus",
"type":"prometheus",
"access":"proxy",
"url":"http://{{ hostvars[groups['prometheus_servers'][0]]['ansible_host'] | default(groups['prometheus_servers'][0]) }}:9090",
"isDefault":true
}
headers:
Content-Type: "application/json"
status_code: 200,409
body_format: json
user: admin
password: admin
force_basic_auth: yes
ignore_errors: yes
Con este playbook, tu infraestructura dispondrá de monitorización básica lista para utilizar y fácilmente ampliable.
Consejos y Troubleshooting
- Seguridad: Cambia la contraseña por defecto de Grafana tras el primer despliegue y restringe los accesos a nivel de red.
-
Multihost: Añade tus nodos a
scrape_configs
enprometheus.yml
o genera esta sección usando variables de Ansible. - Extensión: Aprovecha roles o colecciones oficiales si quieres gestión avanzada o instalar exporters específicos.
-
Problemas comunes: Si Prometheus no arranca, revisa los logs con
journalctl -u prometheus
, suele deberse a permisos o rutas de ficheros.