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