Instalar Sensu Monitoring en Debian Jessie

@kahun

Sensu es un framework de monitorización escrito en Ruby que usa RabbitMQ como broker de mensajes y Redis para almacenar datos.

Se compone de servidor, api, cliente y dashboard. El concepto es muy sencillo, tenemos checks con los que lanzamos comandos que generarán eventos y handlers que nos permitirán decidir que hacemos con ellos, además con los checks también podemos recoger métricas con las que luego en combinación de graphite generar gráficas. Los plugins son compatibles con los de Nagios y el dashboard nos permite ver alertas, clientes, silenciar eventos y visualizar múltiples servidores en el mismo panel.

En un mundo dominado por Nagios ha supuesto toda una revolución en el concepto de monitorización y merece la pena darle una oportunidad, os garantizo que no os arrepentiréis.

1 Servidor

1.1 Instalación de RabbitMQ

Añadimos el repositorio:

wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc
echo "deb    http://www.rabbitmq.com/debian/ testing main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
apt-get update

Instalamos los paquetes:

apt-get install -y rabbitmq-server erlang-nox

Esto instalará el servidor de RabbitMQ y levantará el servicio. Ahora añadimos un virtual host que usaremos para aislar los mensajes de Sensu:

rabbitmqctl add\_vhost /sensu

Creamos un nuevo usuario:

rabbitmqctl add\_user sensu password

Y le asignamos permisos para el virtual host que hemos creado:

rabbitmqctl set\_permissions -p /sensu sensu ".\*" ".\*" ".\*"

1.2 Instalación de Redis

Instalamos el paquete:

apt-get install -y redis-server

Redis arrancará automáticamente en el puerto 6379. La configuración por defecto es suficiente.

1.3 Instalación del servidor

Añadimos el repositorio de Sensu:

wget -q http://repositories.sensuapp.org/apt/pubkey.gpg -O- | sudo apt-key add -
echo "deb    http://repositories.sensuapp.org/apt sensu main" | sudo tee /etc/apt/sources.list.d/sensu.list
apt-get update

Instalamos el paquete:

apt-get install -y sensu

El mismo paquete contiene el servidor, el api y el cliente. Ahora instalamos también el dashboard:

apt-get install -y uchiwa

1.4 Configuración del servidor

Creamos el fichero de configuración para RabbitMQ:

sudo vi /etc/sensu/conf.d/rabbitmq.json

Y añadimos el siguiente contenido junto con el password que antes usamos para dar de alta el usuario sensu en RabbitMQ:

{
  "rabbitmq": {
    "host": "localhost",
    "port": 5672,
    "vhost": "/sensu",
    "user": "sensu",
    "password": "password"
  }
}

Hacemos lo mismo para Redis:

sudo vi /etc/sensu/conf.d/redis.json

Y añadimos el siguiente contenido:

{
  "redis": {
    "host": "localhost",
    "port": 6379
  }
}

Ahora creamos el fichero de configuración del api:

sudo vi /etc/sensu/conf.d/api.json

Con el siguiente contenido, donde configuramos el puerto que usará el servicio:

{
  "api": {
    "host": "localhost",
    "port": 4567
  }
}

El servidor de sensu se monitorizará a sí mismo, así que también creamos la configuración del cliente:

sudo vi /etc/sensu/conf.d/client.json

Y añadimos el siguiente contenido:

{
  "client": {
    "name": "client1",
    "address": "localhost",
    "subscriptions": \[ "ALL" \]
  }
}

Creamos el fichero de configuración del dashboard:

sudo vi /etc/sensu/uchiwa.json

Sustituimos el contenido que haya por el siguiente:

{
    "sensu": \[
        {
            "name": "Location1",
            "host": "localhost",
            "ssl": false,
            "port": 4567,
            "path": "",
            "timeout": 5000
        }
    \],
    "uchiwa": {
        "port": 3000,
        "stats": 10,
        "refresh": 10000,
        "users": \[
          {
            "host": "0.0.0.0",
            "username": "admin",
            "password": "secret",
            "role": {
              "readonly": false
            }
          }
        \]
    }
}

En el caso de instalar Sensu en otro centro de datos, podemos configurar Uchiwa para visualizar ambos de forma conjunta. La configuración quedaría de la siguiente forma:

{
    "sensu": \[
        {
            "name": "Location1",
            "host": "localhost",
            "ssl": false,
            "port": 4567,
            "path": "",
            "timeout": 5000
        },
        {
            "name": "Location2",
            "host": "publicip.sensuserver.location2",
            "ssl": false,
            "port": 4567,
            "path": "",
            "timeout": 5000
        }
    \],
    "uchiwa": {
        "port": 3000,
        "stats": 10,
        "refresh": 10000,
        "users": \[
          {
            "host": "0.0.0.0",
            "username": "admin",
            "password": "secret",
            "role": {
              "readonly": false
            }
          }
        \]
    }
}

Habilitamos todos los servicios para que arranquen de forma automática:

systemctl enable sensu-server
systemctl enable sensu-api
systemctl enable sensu-client
systemctl enable uchiwa

Y los arrancamos:

systemctl start sensu-server
systemctl start sensu-api
systemctl start sensu-client
systemctl start sensu-uchiwa

Ya deberíamos poder conectar al dashboard mediante la url: http://ip-address:3000

2 Cliente

2.1 Instalación del cliente

Añadimos el repositorio como lo hicimos para el servidor:

wget -q http://repositories.sensuapp.org/apt/pubkey.gpg -O- | sudo apt-key add -
echo "deb    http://repositories.sensuapp.org/apt sensu main" | sudo tee /etc/apt/sources.list.d/sensu.list
apt-get update

Instalamos el paquete:

apt-get install -y sensu

Creamos el fichero de configuración para RabbitMQ:

sudo vi /etc/sensu/conf.d/rabbitmq.json

Y añadimos el siguiente contenido junto con el password que antes usamos para dar de alta el usuario sensu en RabbitMQ y la ip del servidor:

{
  "rabbitmq": {
    "host": "ip.rabbitmq.server",
    "port": 5672,
    "vhost": "/sensu",
    "user": "sensu",
    "password": "password"
  }
}

Creamos el fichero de configuración del cliente:

sudo vi /etc/sensu/conf.d/client.json

Y añadimos el siguiente contenido con el nombre del nuevo cliente y su ip para que pueda conectar con el servidor de sensu:

{
  "client": {
    "name": "client2",
    "address": "client2.ip.address",
    "subscriptions": \[ "ALL" \]
  }
}

Habilitamos el servicio para que arranque de forma automática:

systemctl enable sensu-client

Y lo arrancamos:

systemctl start sensu-client

3 Alertas

3.1 Añadir un check

Para probar nuestro servidor vamos a añadir el primer chequeo, como ejemplo vamos a usar uno de los muchos plugins disponibles, además hay que recordar que los plugins de Sensu usan el mismo formato que Nagios por los que también son compatibles.

En nuestro caso lo vamos a instalar embebido en la instalación del sensu, de esta forma si no tenemos una intalación de Ruby podemos usar la que trae Sensu o si después nos arrepentimos, basta con borrar el directorio /opt/sensu para eliminar con ello también todos los plugins que hayamos instalado. Para ello debemos asegurarnos que el fichero /etc/default/sensu tenga el siguiente contenido:

EMBEDDED\_RUBY=true

Ahora instalamos el plugin:

/opt/sensu/embedded/bin/gem install sensu-plugins-process-checks

Creamos el fichero de configuración de nuestro check:

sudo vi /etc/sensu/conf.d/check\_cron.json

Y añadimos el siguiente contenido:

{
  "checks": {
    "cron\_check": {
      "command": "/opt/sensu/embedded/bin/check-process.rb -p cron",
      "subscribers": \[ "ALL" \],
      "interval": 60,
      "occurrences": 5,
      "refresh": 1800
    }
  }
}

Comprobará que el servicio cron se esté ejecutando cada 60 segundos, de fallar enviará el primer evento cuando se repita 5 veces, es decir a los 5 minutos, con repetición cada 30 minutos. Para activar el chequeo tenemos que reiniciar los servicios, para ello ejecutamos:

systemctl restart sensu-server
systemctl restart sensu-api
systemctl restart sensu-client

Podemos para el cron para probarlo:

systemctl stop cron

3.2 Añadir un handler

Para mejorar el formato de los emails vamos a añadir nuestro primer handler, para ello instalamos el siguiente plugin:

/opt/sensu/embedded/bin/gem install sensu-plugins-mailer

Ahora creamos el fichero de configuración del handler:

sudo vi /etc/sensu/conf.d/handler\_mailer.json

Y añadimos el siguiente contenido:

{
  "mailer": {
    "admin\_gui": "http://ip-address:3000",
    "mail\_from": "sensu@example.com",
    "mail\_to": "nuestroemail@example.com",
    "smtp\_port": "25",
    "smtp\_address": "localhost"
  },
  "handlers": {
    "mailer": {
      "command": "/opt/sensu/embedded/bin/handler-mailer.rb",
      "type": "pipe"
    }
  }
}

Ahora editamos el check que creamos antes:

sudo vi /etc/sensu/conf.d/check\_cron.json

Para añadir el handler:

{
  "checks": {
    "cron\_check": {
      "command": "/opt/sensu/embedded/bin/check-process.rb -p cron",
      "handlers": \[ "mailer" \],
      "subscribers": \[ "ALL" \],
      "interval": 60,
      "occurrences": 5,
      "refresh": 1800
    }
  }
}

Y reiniciamos los servicios:

systemctl restart sensu-server
systemctl restart sensu-api

4 Conclusiones

Y esto es todo, Sensu es muy versátil y muy fácil de configurar aunque para despliegues de varios servidores recomendaría usar un gestor de configuración como Puppet, Chef o Ansible.

Después de usar Nagios, Sensu es un soplo de aire fresco en el mundo de la monitorización, lástima que algunas características sólo estén presentes en la versión enterprise cómo el Contact Routing y que uchiwa aún no tenga vistas responsive, aún así es una opción muy seria a considerar.