Monitoreando PostgreSQL con Icinga

From PostgreSQL wiki
Jump to navigationJump to search

Primero tenemos que buscar los paquetes correspondientes al sistema donde vamos a instalar Icinga o, en su defecto, descargar los fuentes:

https://www.icinga.org/download/packages/

En este caso se usó un RHEL 6 con arquitectura x86_64, lo cual apunta a un .rpm para agregar el repositorio RepoForge donde se encuentran los paquetes necesarios para la instalación

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
sudo rpm -i rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

Ahora podemos instalar los paquetes necesarios

sudo yum install icinga icinga-idoutils-libdbi-pgsql icinga-web php-pgsql nagios-plugins nagios-plugins-nrpe

El paquete icinga es la base de Icinga, icinga-idoutils-libdbi-pgsql es necesario para la conexión a la base de datos de la cual Icinga va a ser uso (usaremos una base Postgres), icinga-web es el frontend, php-pgsql lo necesitamos para que php pueda conectarse a la base Postgres, y nagios-plugins contiene la mayoría de plugins necesarios para monitoreo.

Modificamos el pg_hba.conf:

sudo su - postgres
vim /var/lib/pgsql/9.2/data/pg_hba.conf

Y agregamos las siguientes líneas:

host    icinga          icinga          127.0.0.1/32            trust
host    icinga_web      icinga_web      127.0.0.1/32            trust

Preparamos los usuarios y las bases de datos para uso de Icinga e Icinga-web:

postgres=# CREATE USER icinga;
postgres=# ALTER USER icinga WITH PASSWORD 'icinga';
postgres=# CREATE DATABASE icinga;
postgres=# CREATE USER icinga_web;
postgres=# ALTER USER icinga_web WITH PASSWORD 'icinga' createdb;
postgres=# CREATE DATABASE icinga_web;
postgres=# SELECT pg_reload_conf();
postgres=# \q

Y ejecutamos los scripts para crear los esquemas de las bases y datos iniciales (La ubicación de estos scripts, así como de otros archivos de configuración, puede variar dependiendo de los directorios de instalación):

psql -h 127.0.0.1 -U icinga -d icinga < /usr/share/doc/icinga-idoutils-libdbi-pgsql-1.8.4/db/pgsql/pgsql.sql
psql -h 127.0.0.1 -U icinga_web -d icinga_web < /usr/share/icinga-web/etc/schema/pgsql.sql

Editamos el archivo de configuración de base de datos de icinga-web para indicarle cómo conectarse a la base:

vim /usr/share/icinga-web/app/config/databases.xml

Y modificamos las siguientes líneas:

<ae:parameter name="dsn">pgsql://icinga_web:icinga_web@127.0.0.1:5432/icinga_web</ae:parameter>
 <ae:parameter name="dsn">pgsql://icinga:icinga@127.0.0.1:5432/icinga</ae:parameter>

También modificamos el archivo de configuración de ido2db:

sudo vim /etc/icinga/ido2db.cfg

Editando la siguiente línea:

db_host=127.0.0.1

Ahora podemos iniciar los servicios:

sudo /etc/init.d/icinga start
sudo /etc/init.d/httpd start
sudo /etc/init.d/ido2db start

Para agregar gráficos estadísticos tenemos que instalar pnp4nagios (en el caso de RHEL6 el paquete se encuentra en el repositorio EPEL, o se puede compilar desde los fuentes en http://sourceforge.net/projects/pnp4nagios/files/):

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -i epel-release-6-8.noarch.rpm
sudo yum install pnp4nagios

Editamos los siguientes archivos de configuración:

sudo vim /etc/pnp4nagios/npcd.cfg

Modificando las siguientes líneas:

user = icinga
group = icinga

El config.php:

sudo vim /etc/pnp4nagios/config.php

Editando esta línea:

$conf['nagios_base'] = "/icinga/cgi-bin";

El icinga.cfg:

sudo vim /etc/icinga/icinga.cfg

Con las siguientes líneas:

process_performance_data=1

host_perfdata_file=/var/lib/pnp4nagios/host-perfdata
service_perfdata_file=/var/lib/pnp4nagios/service-perfdata

service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$

host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$

service_perfdata_file_mode=a
host_perfdata_file_mode=a

service_perfdata_file_processing_interval=30
host_perfdata_file_processing_interval=30

service_perfdata_file_processing_command=process-service-perfdata-file
host_perfdata_file_processing_command=process-host-perfdata-file

Y el commands.cfg:

sudo vim /etc/icinga/objects/commands.cfg

Agregando lo siguiente:

# pnp
define command{
        command_name    process-service-perfdata-file
        command_line    /bin/mv /var/lib/pnp4nagios/service-perfdata /var/spool/pnp4nagios/
}

define command{
        command_name    process-host-perfdata-file
        command_line    /bin/mv /var/lib/pnp4nagios/host-perfdata /var/spool/pnp4nagios/
}


La instalación de pnp4nagios crea algunos directorios con permisos para el usuario “nagios”, tenemos que cambiarlo al usuario “icinga”:

sudo chown icinga:icinga /var/lib/pnp4nagios/
sudo chown icinga:icinga /var/spool/pnp4nagios/

Tenemos que crear un archivo con las credenciales para Apache:

sudo htpasswd -c /etc/icinga/htpasswd.users icingaadmin

E indicarle al Apache que lo use:

sudo vim /etc/httpd/conf.d/pnp4nagios.conf

Editando la siguiente línea:

AuthUserFile /etc/icinga/htpasswd.users

Iniciamos el servicio npcd y reiniciamos los de icinga y apache

sudo /etc/init.d/npcd start
sudo /etc/init.d/icinga restart
sudo /etc/init.d/httpd restart

Para monitorear Postgres vamos a hacer uso del plugin check_postgres:

cd /usr/lib64/nagios/plugins/
sudo wget http://bucardo.org/downloads/check_postgres.tar.gz
tar -xzf check_postgres.tar.gz

Tenemos que agregar el comando de check_postgres al archivo /etc/icinga/objects/commands.cfg:

# check_postgres
define command {
        command_name    check_postgres
        command_line    $USER1$/check_postgres-2.20.1/check_postgres.pl -H $HOSTADDRESS$ --action $ARG1$ -w $ARG2$ -c $ARG3$
}

Nota: Para poder monitorear la máquina remota con check_postgres se necesita tener la entrada correspondiente en pg_hba.conf del host remoto dando los permisos correspondientes al servidor de monitoreo

En el archivo icinga.cfg se pueden especificar los archivos de configuración que se van a cargar, por defecto hay un archivo para definir el monitoreo a localhost

cfg_file=/etc/icinga/objects/localhost.cfg

Para incluir otro host a monitorear agregamos otra línea indicando el archivo que vamos a usar:

cfg_file=/etc/icinga/objects/host.cfg

Creamos el archivo:

sudo vim /etc/icinga/objects/host.cfg

Y agregamos la definición del host (con la ip correspondiente) y los servicios a monitorear:

define host{
        use                     linux-server
        host_name               server1
        alias                   server1
        address                 192.168.0.114
        }

# check_postgres_locks
define service{
        use                             generic-service
        host_name                       server1
        service_description             PGSQL Locks
        check_command                   check_postgres!locks!40!80
}

# check_postgres_txn_idle
define service{
        use                             generic-service
        host_name                       server1
        service_description             PGSQL Txn_idle
        check_command                   check_postgres!txn_idle!’20 minutes’!’4 hours’
}

# check_postgres_bloat
define service{
        use                             generic-service
        host_name                       server1
        service_description             PGSQL Bloat
        check_command                   check_postgres!bloat!30%!60%

}


Para poder monitorear otros aspectos del host (por ejemplo, el número de procesos) hay que instalar nagios-plugins y nrpe-server en el host, para este ejemplo usamos una máquina Debian:

sudo apt-get install nagios-nrpe-server nagios-plugins

Tenemos que editar el archivo de configuración /etc/nagios/nrpe.cfg para especificar la ip desde la cual se va a monitorear:

allowed_hosts=192.168.0.110

Y reiniciamos el servicio de nrpe:

sudo /etc/init.d/nagios-nrpe-server restart

Agregamos el comando de check_nrpe al /etc/icinga/objects/commands.cfg:

# check_nrpe
define command {
        command_name    check_nrpe
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}


Y añadimos el comando de lo que queramos monitorear al archivo donde definimos el host (/etc/icinga/objects/host.cfg):

# total_processes
define service{
        use                             generic-service
        host_name                       server1
        service_description             Total Processes
        check_command                   check_nrpe!check_total_procs
}


Los comandos disponibles para ejecutar en el host remoto estarán definidos en ese host en el archivo /etc/nagios/nrpe.cfg, así mismo podremos añadir más comandos dependiendo de los plugins que estén disponibles.

Para poder habilitar las notificaciones por correo primero tenemos que ser capaces de enviar correos mediante la terminal, para esto se puede instalar y configurar algún servidor de correo como Postfix.

Luego de tener el servidor de correo funcionando tenemos que agregar los detalles de contacto a /etc/icinga/objects/contacts.cfg

define contact {
        contact_name                    cchapi
        host_notifications_enabled      1
        host_notification_period        24x7
        host_notification_options       d,u,r
        host_notification_commands      notify-host-by-email
        service_notifications_enabled   1
        service_notification_period     24x7
        service_notification_options    w,u,c,r
        service_notification_commands   notify-service-by-email
        email                           carlos.chapi@2ndquadrant.com
}

Y agregar el contacto a los servicios o host de los cuales queramos recibir notificaciones (además de las opciones de notificación que queramos):

# total_processes
define service{
        use                             generic-service
        host_name                       server1
        service_description             Total Processes
        notification_period             24x7
        notification_interval           60
        notification_options            u,c,w,r
        check_command                   check_nrpe!check_total_procs
        contacts                        cchapi
}

Por último agregamos los comandos que enviarán correos a /etc/icinga/objects/commands.cfg

# 'notify-host-by-email' command definition
 define command {
        command_name   notify-host-by-email
        command_line   /usr/bin/printf "%b" "***** Icinga *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /bin/mailx -s "** $NOTIFICATIONTYPE$ Host Alert:  $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$
        }

 # 'notify-service-by-email' command definition
 define command {
        command_name   notify-service-by-email
        command_line   /usr/bin/printf "%b" "***** Icinga *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n $SERVICEOUTPUT$\n" | /bin/mailx -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
        }

Esto en el caso de utilizar Postfix como servidor de correo.

Hacemos un reload al servicio de Icinga para que cargue la nueva configuración

/etc/init.d/icinga reload