Monitorizar HTTP o URL con Icinga2

El objetivo de esta guía es la de poder realizar monitorizaciones que sean reportadas de manera correcta al apartado de Icinga2 Web. Es bastante confusa la documentación que existe por Internet así que quise hacer un POST bastante claro con la explicación.

Vamos a explorar dos maneras de hacerlo:

  1. Módulo check_http
  2. Módulo WebInject

Debemos tener en cuenta que el servicio está montado como un servidor master (donde llegan los chequeos) y los clientes que son los que reportan a este.

Módulo check_http

Lo primero que debemos hacer es comprobar si tenemos habilitado dicho módulo y sobre quién se va a ejecutar.

En mi caso se encuentran:

/etc/icinga2/zones.d/global-templates/services.conf

Aquí buscamos las siguientes líneas:

apply Service for (http_vhost => config in host.vars.http_vhosts) {
  import "generic-service"

  check_command = "http"

  vars += config
  assign where host.vars.http_vhosts
}

Después pasamos a configurar nuestro Host con las URLs:

object Host "mi-host-remoto.ext" {
  display_name="mi-host-remoto"
  check_command = "hostalive" //check is executed on the master
  address = "192.168.1.69"

vars.http_vhosts["Test Web 1"] = {
        http_vhost = "dominio.com"
        http_address = "dominio.com"
        http_uri = "/ruta1/fichero.ext"
        http_sni = true
        http_onredirect = "follow"
        http_verbose = false
        http_ssl = true
  }

  vars.http_vhosts["Test Web 2"] = {
        http_vhost = "dominio2.com"
        http_address = "dominio2.com"
        http_sni = true
        http_onredirect = "follow"
        http_verbose = false
        http_ssl = true
  }
}

Vamos a explicar un poco las variables usadas explicando el caso «Test Web 1»:

  • vars.http_vhosts[«Test Web 1»]: Es el nombre del chequeo que aparecerá en Icinga2 Web.
  • http_vhost: En algunos casos es necesario añadir el dominio al que está asociado el virtualHost (Apache, Nginx…).
  • http_address: El dominio al que queremos acceder para revisar la configuración.
  • http_uri: Lo que viene a continuación después del dominio en la URL. Por defecto es «/».
  • http_sni: Esta opción indica si bajo el mismo puerto pueden haber varios certificados. Valores true | false.
  • http_onredirect: El comportamiento que quieres que haga cuando se encuentra una redirección.
  • http_verbose: Nos muestra en la salida del comando lo que ve. Opción muy buena para debug.
  • http_ssl: Nos indica si nuestro dominio va sobre https.

Creo que la explicación es bastante clara, pero para ayudarnos a entenderlo mejor o más opciones tenemos la documentación oficial.

Para las persona que no saben mucho sobre como se gestiona este chequeo, viene por defecto activado/configurado junto con el resto de scripts en:

/usr/share/icinga2/include/command-plugins.conf

La única parte que nos queda es comprobar que funciona correctamente nuestros cambios:

# ICINGA CHECK
icinga2 daemon -C

# Si todo está bien reiniciamos Icinga
systemctl restart icinga2

Modulo WebInject

Otra forma de chequear las webs es a través de WebInject, otra librería que viene incluida por defecto en la instalación de Icinga2.


Antes de empezar vamos a instalar el paquete para el protocolo https de este módulo. Lo primero que me encontré fue que tuve un problema a la hora de monitorizar https.

yum install perl-LWP-Protocol-https

Ahora, vamos a definir el servicio ya que por defecto no viene configurado.

/etc/icinga2/zones.d/global-templates/services.conf

Vamos a configurar que cuando encuentra una variable del tipo «webinject_testcase_file» en nuestro objeto HOST aplique directamente la configuración.

# Aplicar webinject cuando tengamos un fichero configurado
apply Service "web_test" {
  check_command = "webinject"
  command_endpoint = host.vars.client_endpoint
  assign where host.vars.webinject_testcase_file
}

Ahora vamos a poner la configuración de nuestro Host:

object Host "mi-host-remoto.ext" {
  display_name="mi-host-remoto"
  check_command = "hostalive" //check is executed on the master
  address = "192.168.1.69"

  # Check URLs
  vars.webinject_testcase_file="/usr/lib64/nagios/plugins/webinj/test1.xml"
}

Ahora vamos a proceder a crear nuestro fichero en la ruta que hemos establecido (/usr/lib64/nagios/plugins/webinj/test1.xml):

<testcases repeat="1">
        <reporttype>nagios</reporttype>
        <case
                id="1"
                description1="Test Web 1"
                description2="Monitorizar la web oficial"
                method="get"
                url="https://www.dominio.com"
                verifypositive="Tarifas de"
        />
        <case
                id="2"
                description1="Test Web 2"
                description2="Monitorizar Ruta Extra en la web"
                method="get"
                url="https://dominio.com/ruta1/fichero.ext"
                verifyresponsecode="200"
        />
</testcases>

Vamos a explicar un poco las variables que hemos usado:

  • reporttype: Especificaremos el tipo de report que queremos. Algunos ejemplos nagios, mrtg, external, standard.
  • case: Englobaremos cada uno de los chequeos que queramos poner aquí. En nuestro caso son 2.
  • id: Necesario para identificar las reglas.
  • description1: Descripción corta del chequeo.
  • description2: Descripción larga del chequeo.
  • method: En nuestro caso usamos get, pero podemos usar post también.
  • url: La dirección web que vamos a chequear.
  • verifypositive: Revisa si encuentra una frase o palabra en el contenido de la web.
  • verifyresponsecode: Indica el valor que esperamos para que sea OK el chequeo. En mi caso 200.

La gran ventaja de este chequeo (que viene de Nagios) tiene una buena documentación para poder hacer configuraciones más avanzadas. Entre ellas accesos a webs, cabeceras, etc…

Aquí os dejo configuración para tenerla a mano:

La única parte que nos queda es comprobar que funciona correctamente nuestros cambios:

# ICINGA CHECK
icinga2 daemon -C

# Si todo está bien reiniciamos Icinga
systemctl restart icinga2

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *