La monitorización de infraestructuras modernas requiere herramientas potentes y escalables. Ansible Prometheus combina la automatización declarativa de Ansible con el sistema de monitorización líder en DevOps para crear un stack de observabilidad completo. En este tutorial aprenderás a desplegar Prometheus, Grafana, Alertmanager y Node Exporter de forma automatizada, eliminando configuraciones manuales y reduciendo errores humanos en tu infraestructura de monitorización.
¿Qué es Ansible Prometheus y Por Qué Usarlo?
Ansible Prometheus es la combinación de playbooks de Ansible para automatizar el despliegue y configuración de Prometheus, el sistema de monitorización y alertas de código abierto desarrollado originalmente por SoundCloud. Prometheus recopila y almacena métricas como datos de series temporales, emparejando valores numéricos con marcas de tiempo y etiquetas clave-valor opcionales.
La arquitectura de Prometheus opera con un modelo pull, extrayendo métricas de trabajos instrumentados vía HTTP. Los servidores Prometheus son autónomos, no dependen de almacenamiento distribuido ni servicios remotos, lo que los hace confiables durante interrupciones de infraestructura. Esta característica es crítica cuando necesitas monitorizar tu infraestructura de forma resiliente.
Según un artículo oficial de Prometheus, el sistema excede en series temporales numéricas en arquitecturas de microservicios, donde su modelo de datos multidimensional y el lenguaje de consulta PromQL brillan particularmente. Para complementar tu stack de monitorización, puedes integrar Ansible Elasticsearch para análisis de logs centralizados.
Componentes del Stack Ansible Prometheus
Un despliegue completo de Ansible Prometheus incluye varios componentes esenciales que trabajan juntos para proporcionar monitorización end-to-end:
- Prometheus Server: El componente central que extrae y almacena datos de series temporales localmente, ejecutando reglas para agregar datos o disparar alertas
- Alertmanager: Maneja el enrutamiento de alertas y notificaciones hacia canales como Slack, PagerDuty o email
- Node Exporter: Exportador especializado que expone métricas de hardware y sistema operativo (CPU, memoria, disco, red) de máquinas Linux
- Grafana: Plataforma de visualización que consume datos de Prometheus para crear dashboards profesionales e interactivos
- Pushgateway: Intermediario para trabajos de corta duración que no pueden ser extraídos directamente
Para desplegar estos componentes, la colección prometheus.prometheus de Ansible Galaxy es ahora el enfoque recomendado, ya que los roles antiguos de CloudAlchemy han sido deprecados en su favor. Si estás trabajando con contenedores, también puedes combinar este stack con Grafana Docker Compose para entornos más ligeros.
Playbook Completo Ansible Prometheus: Instalación Paso a Paso
Este playbook de Ansible Prometheus automatiza la instalación de todo el stack de monitorización en servidores Ubuntu/Debian. Primero, crea la estructura de directorios necesaria:
---
- name: Deploy Prometheus Monitoring Stack
hosts: monitoring_servers
become: yes
vars:
prometheus_version: "2.48.0"
prometheus_dir: /opt/prometheus
prometheus_config_dir: /etc/prometheus
grafana_version: "10.2.2"
node_exporter_version: "1.7.0"
alertmanager_version: "0.26.0"
tasks:
- name: Install required packages
apt:
name:
- wget
- tar
- curl
- apt-transport-https
- software-properties-common
state: present
update_cache: yes
- name: Create prometheus user
user:
name: prometheus
shell: /bin/false
create_home: no
system: yes
- name: Create prometheus directories
file:
path: "{{ item }}"
state: directory
owner: prometheus
group: prometheus
mode: '0755'
loop:
- "{{ prometheus_dir }}"
- "{{ prometheus_config_dir }}"
- "{{ prometheus_config_dir }}/rules"
- /var/lib/prometheus
- name: Download and extract Prometheus
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
extra_opts: [--strip-components=1]
owner: prometheus
group: prometheus
- name: Create Prometheus configuration
copy:
dest: "{{ prometheus_config_dir }}/prometheus.yml"
owner: prometheus
group: prometheus
mode: '0644'
content: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: 'production'
environment: 'prod'
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
rule_files:
- "rules/*.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
- job_name: 'alertmanager'
static_configs:
- targets: ['localhost:9093']
- name: Create Prometheus systemd service
copy:
dest: /etc/systemd/system/prometheus.service
mode: '0644'
content: |
[Unit]
Description=Prometheus Monitoring System
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart={{ prometheus_dir }}/prometheus \
--config.file={{ prometheus_config_dir }}/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--web.console.templates={{ prometheus_dir }}/consoles \
--web.console.libraries={{ prometheus_dir }}/console_libraries \
--web.listen-address=0.0.0.0:9090 \
--storage.tsdb.retention.time=30d
Restart=always
[Install]
WantedBy=multi-user.target
- name: Enable and start Prometheus
systemd:
name: prometheus
enabled: yes
state: started
daemon_reload: yes
Este playbook base instala Prometheus con configuración básica. La retención de datos está configurada a 30 días, puedes ajustarla según tus necesidades de almacenamiento. Para configuraciones más complejas con Ansible Redis, puedes añadir métricas personalizadas de Redis usando exportadores especializados.
Ansible Prometheus: Configuración de Node Exporter
Node Exporter es fundamental en cualquier implementación de Ansible Prometheus porque expone métricas de sistema operativo y hardware. Añade estas tareas a tu playbook para desplegar Node Exporter en todos tus servidores:
- name: Download and extract Node Exporter
unarchive:
src: "https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_version }}/node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
dest: /opt
remote_src: yes
extra_opts: [--strip-components=1]
creates: /opt/node_exporter
- name: Create Node Exporter systemd service
copy:
dest: /etc/systemd/system/node_exporter.service
mode: '0644'
content: |
[Unit]
Description=Prometheus Node Exporter
Documentation=https://prometheus.io/docs/guides/node-exporter/
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/node_exporter \
--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/) \
--collector.netclass.ignored-devices=^(veth.*|docker.*|br-.*)$
Restart=always
[Install]
WantedBy=multi-user.target
- name: Enable and start Node Exporter
systemd:
name: node_exporter
enabled: yes
state: started
daemon_reload: yes
Node Exporter se ejecuta en el puerto 9100 por defecto y expone más de 100 métricas diferentes sobre CPU, memoria, disco, red y otros recursos del sistema. La documentación oficial de Prometheus Node Exporter proporciona detalles sobre todas las métricas disponibles y colectores opcionales que puedes habilitar.
Implementar Alertmanager con Ansible Prometheus
Alertmanager es el componente de Ansible Prometheus responsable de gestionar alertas: deduplicación, agrupación, enrutamiento a receptores correctos como email, Slack o PagerDuty, y silenciamiento. Aquí está la configuración completa:
- name: Create alertmanager directories
file:
path: "{{ item }}"
state: directory
owner: prometheus
group: prometheus
mode: '0755'
loop:
- /opt/alertmanager
- /etc/alertmanager
- /var/lib/alertmanager
- name: Download and extract Alertmanager
unarchive:
src: "https://github.com/prometheus/alertmanager/releases/download/v{{ alertmanager_version }}/alertmanager-{{ alertmanager_version }}.linux-amd64.tar.gz"
dest: /opt/alertmanager
remote_src: yes
extra_opts: [--strip-components=1]
owner: prometheus
group: prometheus
- name: Create Alertmanager configuration
copy:
dest: /etc/alertmanager/alertmanager.yml
owner: prometheus
group: prometheus
mode: '0644'
content: |
global:
resolve_timeout: 5m
slack_api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: 'slack-notifications'
receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#alerts'
title: 'Prometheus Alert'
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
- name: Create alert rules for Prometheus
copy:
dest: "{{ prometheus_config_dir }}/rules/alerts.yml"
owner: prometheus
group: prometheus
mode: '0644'
content: |
groups:
- name: instance_alerts
interval: 30s
rules:
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 10m
labels:
severity: warning
annotations:
summary: "High CPU usage detected on {{ $labels.instance }}"
description: "CPU usage is above 80% for more than 10 minutes."
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "Memory usage is above 85% for more than 10 minutes."
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 15
for: 5m
labels:
severity: critical
annotations:
summary: "Low disk space on {{ $labels.instance }}"
description: "Disk space on root partition is below 15%."
- name: Create Alertmanager systemd service
copy:
dest: /etc/systemd/system/alertmanager.service
mode: '0644'
content: |
[Unit]
Description=Prometheus Alertmanager
Documentation=https://prometheus.io/docs/alerting/latest/alertmanager/
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/alertmanager/alertmanager \
--config.file=/etc/alertmanager/alertmanager.yml \
--storage.path=/var/lib/alertmanager \
--web.listen-address=0.0.0.0:9093
Restart=always
[Install]
WantedBy=multi-user.target
- name: Enable and start Alertmanager
systemd:
name: alertmanager
enabled: yes
state: started
daemon_reload: yes
Las reglas de alerta incluidas monitorean instancias caídas, uso alto de CPU, memoria y espacio en disco. Para entornos con Ansible Kubernetes, necesitarás añadir reglas específicas para pods, deployments y recursos de cluster. La documentación oficial de Alertmanager proporciona ejemplos avanzados de enrutamiento y agrupación de alertas.
Integración de Grafana en tu Stack Ansible Prometheus
Grafana transforma los datos de Ansible Prometheus en dashboards visuales impresionantes. Aunque Prometheus incluye una consola web básica, Grafana proporciona capacidades de visualización profesionales con plantillas, variables y alertas visuales:
- name: Add Grafana APT repository key
apt_key:
url: https://apt.grafana.com/gpg.key
state: present
- name: Add Grafana APT repository
apt_repository:
repo: deb https://apt.grafana.com stable main
state: present
filename: grafana
- name: Install Grafana
apt:
name: grafana
state: present
update_cache: yes
- name: Create Grafana datasource configuration
copy:
dest: /etc/grafana/provisioning/datasources/prometheus.yml
mode: '0644'
content: |
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://localhost:9090
isDefault: true
editable: true
- name: Enable and start Grafana
systemd:
name: grafana-server
enabled: yes
state: started
Después de desplegar Grafana, accede a la interfaz web en http://tu-servidor:3000 (usuario: admin, contraseña: admin). Grafana incluye dashboards prediseñados para Node Exporter disponibles en Grafana Dashboards. El dashboard ID 1860 es especialmente popular para métricas de Node Exporter y proporciona visualizaciones detalladas de CPU, memoria, red y disco.
Ansible Prometheus: Mejores Prácticas de Producción
Implementar Ansible Prometheus en producción requiere considerar varios aspectos críticos de seguridad, rendimiento y escalabilidad:
Seguridad y Autenticación
Por defecto, Prometheus y Grafana no incluyen autenticación. Para producción, configura autenticación básica HTTP o implementa un reverse proxy con Nginx que maneje SSL/TLS y autenticación. Puedes usar Ansible Nginx para automatizar la configuración del proxy reverso con certificados SSL de Let’s Encrypt.
Alta Disponibilidad
Para alta disponibilidad de Ansible Prometheus, despliega múltiples instancias de Prometheus que extraigan las mismas métricas. Usa Thanos o Cortex para almacenamiento a largo plazo y consultas federadas. Alertmanager soporta clustering nativo para deduplicación de alertas entre instancias.
Optimización de Recursos
- Ajusta scrape_interval según necesidades (15s-60s típicamente)
- Configura retención de datos apropiada (storage.tsdb.retention.time)
- Usa relabeling para filtrar métricas innecesarias
- Implementa service discovery para entornos dinámicos con Kubernetes o Consul
- Monitoriza el propio Prometheus con métricas TSDB
Para entornos con seguridad crítica, combina tu stack de monitorización con Ansible Security Hardening para implementar estándares CIS y DISA STIG en tus servidores de monitorización.
Monitoreo Avanzado: Service Discovery y Exportadores
Una de las fortalezas de Ansible Prometheus es su capacidad de descubrimiento dinámico de servicios. En lugar de configurar targets estáticos, puedes usar service discovery para entornos que cambian constantemente:
scrape_configs:
- job_name: 'consul-services'
consul_sd_configs:
- server: 'localhost:8500'
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*,monitoring,.*
action: keep
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
Además de Node Exporter, puedes desplegar exportadores especializados para tecnologías específicas. El repositorio oficial de Prometheus en GitHub mantiene una lista extensa de exportadores para MySQL, PostgreSQL, Redis, Nginx, Apache, RabbitMQ, MongoDB y muchos más. Para infraestructura cloud, considera integrar tu stack con Ansible Terraform para aprovisionar y monitorizar infraestructura cloud de forma unificada.
FAQ: Preguntas Frecuentes sobre Ansible Prometheus
¿Cuánto espacio en disco necesita Prometheus?
Prometheus almacena aproximadamente 1-2 bytes por muestra. Con 1000 series temporales extraídas cada 15 segundos, necesitarás alrededor de 6-12 GB por mes. Usa la fórmula: (scrapes_per_day × samples_per_scrape × bytes_per_sample × retention_days) para calcular tus necesidades específicas. La compresión TSDB de Prometheus reduce significativamente el almacenamiento real.
¿Puedo usar Ansible Prometheus con Docker y Kubernetes?
Absolutamente. Prometheus tiene soporte nativo para Kubernetes service discovery y puede monitorizar contenedores Docker mediante cAdvisor. Para despliegues en contenedores, considera usar Prometheus Operator en Kubernetes o desplegar Prometheus como contenedor Docker usando los playbooks adaptados para gestión de contenedores.
¿Cómo escala Prometheus para miles de targets?
Prometheus escala verticalmente muy bien hasta ~10,000 series temporales por servidor. Para escalar más allá, usa federación de Prometheus donde múltiples servidores Prometheus extraen subconjuntos de targets y un Prometheus central extrae datos agregados de ellos. Soluciones como Thanos o Cortex proporcionan almacenamiento a largo plazo y consultas globales sobre múltiples instancias Prometheus.
¿Qué ventajas tiene Ansible Prometheus sobre configuración manual?
Ansible Prometheus proporciona idempotencia (ejecutar múltiples veces produce el mismo resultado), versionado de configuración con Git, consistencia entre entornos (desarrollo, staging, producción), y rollback fácil de cambios. Además, reduce tiempo de despliegue de horas a minutos y elimina errores de configuración manual que son comunes en archivos YAML complejos.
¿Cómo integro alertas de Prometheus con PagerDuty o Opsgenie?
Alertmanager soporta integraciones nativas con PagerDuty, Opsgenie, VictorOps y otros sistemas de gestión de incidentes. Configura receivers en alertmanager.yml con tus API keys y routing rules para enviar alertas críticas a sistemas de on-call mientras alertas de warning van a Slack. La documentación oficial proporciona ejemplos específicos para cada integración.
Conclusión: Domina tu Infraestructura con Ansible Prometheus
Ansible Prometheus representa la combinación perfecta de automatización y observabilidad para infraestructuras modernas. Al automatizar el despliegue de Prometheus, Grafana, Alertmanager y Node Exporter, eliminas configuraciones manuales propensas a errores y creas un stack de monitorización reproducible y escalable. Los playbooks presentados en este tutorial proporcionan una base sólida que puedes extender con exportadores especializados, service discovery y alta disponibilidad según tus necesidades específicas.
La arquitectura pull de Prometheus, combinada con la potencia de automatización de Ansible, te permite monitorizar desde pequeños despliegues hasta infraestructuras masivas con miles de servicios. Implementa estos playbooks en tu entorno, personaliza las reglas de alerta según tus SLOs, y obtén visibilidad completa de tu infraestructura en minutos en lugar de días. Con Grafana visualizando tus métricas de Prometheus, tendrás insights en tiempo real que te permiten diagnosticar problemas rápidamente y mantener tus sistemas funcionando de forma óptima.
