Automatiza la Monitorización con Prometheus y Grafana: Playbook Completo de Ansible

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 en prometheus.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.

¡No subestimes el valor de la monitorización automatizada! Ahora puedes desplegarla en minutos con infraestructura como código siguiendo las buenas prácticas de Ansible[2][3].

Avatar

Por Mid