Monitoreando PostgreSQL con Icinga

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
Category:Español