manuales:nagios:capacitacion:ndo2utils
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
| manuales:nagios:capacitacion:ndo2utils [2015/10/22 17:09] – creado cayu | manuales:nagios:capacitacion:ndo2utils [2015/10/22 17:37] (actual) – cayu | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| ====== NDO2Utils ====== | ====== NDO2Utils ====== | ||
| - | + | NdoUtils, es una herramienta complementaria | |
| - | El generador de graficas **Nagvis** necesita acceder a los datos que **Nagios** genera, una de las formas de acceder | + | |
| < | < | ||
| Línea 143: | Línea 142: | ||
| </ | </ | ||
| + | === MySQL === | ||
| + | |||
| + | MySQL es uno de los Sistemas Gestores de Bases de Datos Relacional multihilo y multiusuario, | ||
| + | |||
| + | == Compilacion == | ||
| + | |||
| + | Debemos descargar el paquete de su web oficial y proceder a compilarlo. | ||
| + | |||
| + | < | ||
| + | root@localhost # groupadd mysql | ||
| + | root@localhost # useradd -g mysql mysql | ||
| + | root@localhost # gunzip < mysql-VERSION.tar.gz | tar -xvf - | ||
| + | root@localhost # cd mysql-VERSION | ||
| + | root@localhost # ./configure --prefix=/ | ||
| + | root@localhost # make | ||
| + | root@localhost # make install | ||
| + | root@localhost # cp support-files/ | ||
| + | root@localhost # cd / | ||
| + | root@localhost # bin/ | ||
| + | root@localhost # chown -R root . | ||
| + | root@localhost # chown -R mysql var | ||
| + | root@localhost # chgrp -R mysql . | ||
| + | root@localhost # bin/ | ||
| + | </ | ||
| + | |||
| + | == Establecer la contraseña del usuario root == | ||
| + | |||
| + | |||
| + | Por defecto, el usuario root no tiene asignada una contraseña y esto no es nada recomendable, | ||
| + | |||
| + | |||
| + | // | ||
| + | |||
| + | |||
| + | Cambiar ‘loquesea’ por la contraseña que desemos establecer, pero es importante no olvidarse de teclear las comillas simples. | ||
| + | |||
| + | Comprobamos la nueva contraseña abriendo una sesión en mysql: | ||
| + | |||
| + | |||
| + | //mysql -u root -p// | ||
| + | |||
| + | |||
| + | Nos pedirá la contraseña, | ||
| + | |||
| + | |||
| + | //mysql> show databases;// | ||
| + | |||
| + | |||
| + | Nos mostrará las bases de datos que existan en el servidor, normalmente y si acabamos de instalar, aparecerán las bases de datos mysql y test. | ||
| + | |||
| + | |||
| + | Deberemos crear una base de datos llamada Nagios | ||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | Query OK, 1 row affected (0.00 sec) | ||
| + | mysql> | ||
| + | |||
| + | +----------+ | ||
| + | | Database | | ||
| + | +----------+ | ||
| + | | mysql | | ||
| + | | nagios | ||
| + | | test | | ||
| + | +----------+ | ||
| + | 3 rows in set (0.01 sec) | ||
| + | </ | ||
| + | |||
| + | |||
| + | Ahora deberemos crear un usuario con privilegios de SELECT, INSERT, UPDATE, DELETE | ||
| + | |||
| + | < | ||
| + | CREATE USER nagios IDENTIFIED BY ' | ||
| + | </ | ||
| + | |||
| + | Y darle privilegios sobre la base de datos nagios | ||
| + | |||
| + | < | ||
| + | mysql> GRANT ALL ON nagios.* TO nagios@localhost IDENTIFIED BY " | ||
| + | Query OK, 0 rows affected (0.00 sec) | ||
| + | |||
| + | mysql> quit | ||
| + | </ | ||
| + | |||
| + | Tecleamos exit o quit para salir del programa cliente. | ||
| + | |||
| + | |||
| + | |||
| + | == Paquetes == | ||
| + | |||
| + | |||
| + | La instalacion de **MySQL**, en el caso de tenerlo empaquetado en nuestra distribucion Linux, es bastante simple | ||
| + | |||
| + | ** CentOS y RedHat ** | ||
| + | |||
| + | Para instalar el paquete mysql haremos uso de la utilidad de sistema **up2date** o **yum** | ||
| + | |||
| + | //up2date mysql-server// | ||
| + | |||
| + | //yum install mysql-server// | ||
| + | |||
| + | |||
| + | Y para dejar el servicio corriendo en segundo plano | ||
| + | |||
| + | //service mysqld start// | ||
| + | |||
| + | |||
| + | Para configurar el arranque del servicio | ||
| + | |||
| + | Lo habitual será que cuando arranque o se pare nuestro servidor tambien se inicie o detenga el MySQL, para ello deberemos ejecutar: | ||
| + | |||
| + | |||
| + | //chkconfig --level 35 mysqld on// | ||
| + | |||
| + | |||
| + | Esto activa el demonio mysqld en los runlevel 3 y 5, y lo detiene en el resto. Si queremos comprobar el estado del servicio podemos utilizar lo siguiente: | ||
| + | |||
| + | |||
| + | //chkconfig --list mysqld// | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ** Debian ** | ||
| + | |||
| + | Para instalar mysql en Debian, deberemos ejecutar : | ||
| + | |||
| + | //apt-get install mysql-server mysql-common mysql-client// | ||
| + | |||
| + | Para arrancar el servicio y dejarlo corriendo : | ||
| + | |||
| + | /// | ||
| + | |||
| + | Y para setear su arranque por defecto : | ||
| + | |||
| + | // | ||
| + | |||
| + | |||
| + | ** Nota SuSE ** | ||
| + | |||
| + | Para setear el arranque de un servicio en SuSE Linux deberemos ejecutar el comando //insserv -d nombre_servicio// | ||
| + | |||
| + | |||
| + | |||
| + | === Ejemplo de consultas MySQL === | ||
| + | |||
| + | Podemos realizar plugins que dependan de la salida de otros plugins sin necesidad de consultar o ejecutar nuevamente estos, uilizando los datos contenidos en la base de datos MySQL | ||
| + | |||
| + | Por ejemplo si queremos consultar la lista de miembros de un grupo de hosts | ||
| + | |||
| + | <code sql> | ||
| + | SELECT nagios_hosts.display_name | ||
| + | FROM | ||
| + | nagios_hostgroups, | ||
| + | nagios_hosts, | ||
| + | nagios_objects | ||
| + | WHERE | ||
| + | nagios_hostgroups.hostgroup_id=nagios_hostgroup_members.hostgroup_id | ||
| + | AND | ||
| + | nagios_hostgroup_members.host_object_id=nagios_hosts.host_object_id | ||
| + | AND | ||
| + | nagios_hostgroups.hostgroup_object_id=nagios_objects.object_id | ||
| + | AND | ||
| + | nagios_objects.name1 = ' | ||
| + | ORDER BY nagios_hosts.display_name ASC | ||
| + | </ | ||
| + | |||
| + | Para conocer el estado de un servicio de un determinado host | ||
| + | |||
| + | <code sql> | ||
| + | SELECT | ||
| + | nagios_servicestatus.perfdata, | ||
| + | FROM | ||
| + | nagios_services, | ||
| + | nagios_objects, | ||
| + | WHERE | ||
| + | nagios_services.instance_id=nagios_instances.instance_id | ||
| + | AND | ||
| + | nagios_servicestatus.service_object_id=nagios_services.service_object_id | ||
| + | AND | ||
| + | nagios_servicestatus.service_object_id=nagios_objects.object_id | ||
| + | AND | ||
| + | nagios_objects.name2 = ' | ||
| + | AND | ||
| + | nagios_services.config_type=' | ||
| + | AND | ||
| + | nagios_objects.name1 = ' | ||
| + | </ | ||
| + | |||
| + | Para conocer el estado de un host | ||
| + | |||
| + | <code sql> | ||
| + | SELECT | ||
| + | nagios_hosts.display_name, | ||
| + | nagios_hosts.alias, | ||
| + | nagios_hoststatus.current_state, | ||
| + | nagios_hoststatus.output | ||
| + | FROM | ||
| + | nagios_hoststatus, | ||
| + | nagios_instances, | ||
| + | nagios_hosts, | ||
| + | nagios_objects | ||
| + | WHERE | ||
| + | nagios_hoststatus.host_object_id=nagios_objects.object_id | ||
| + | AND | ||
| + | nagios_hoststatus.host_object_id=nagios_hosts.host_object_id | ||
| + | AND | ||
| + | nagios_hosts.instance_id=nagios_instances.instance_id | ||
| + | AND | ||
| + | nagios_hosts.config_type=' | ||
| + | AND | ||
| + | nagios_hosts.display_name = ' | ||
| + | </ | ||
| + | |||
| + | Para consultar los servicios pertenecientes a un determinado grupo de servicios | ||
| + | |||
| + | <code sql> | ||
| + | SELECT | ||
| + | obj2.name1 AS host_name, | ||
| + | obj2.name2 AS service_description | ||
| + | FROM nagios_servicegroups | ||
| + | INNER JOIN nagios_servicegroup_members ON | ||
| + | nagios_servicegroups.servicegroup_id=nagios_servicegroup_members.servicegroup_id | ||
| + | INNER JOIN nagios_services ON | ||
| + | nagios_servicegroup_members.service_object_id=nagios_services.service_object_id | ||
| + | INNER JOIN nagios_objects as obj1 ON | ||
| + | nagios_servicegroups.servicegroup_object_id=obj1.object_id | ||
| + | INNER JOIN nagios_objects as obj2 ON | ||
| + | nagios_servicegroup_members.service_object_id=obj2.object_id | ||
| + | INNER JOIN nagios_instances ON | ||
| + | nagios_servicegroups.instance_id=nagios_instances.instance_id | ||
| + | WHERE nagios_servicegroups.alias =' | ||
| + | AND nagios_services.display_name =' | ||
| + | </ | ||
| + | |||
| + | Para conocer los estados de los hosts | ||
| + | |||
| + | <code sql> | ||
| + | SELECT nagios_hosts.display_name, | ||
| + | FROM | ||
| + | WHERE nagios_hoststatus.host_object_id = nagios_hosts.host_object_id; | ||
| + | </ | ||
| + | |||
| + | Resultando en una tabla como esta | ||
| + | |||
| + | ^display_name^current_state^ | ||
| + | |firewall|0| | ||
| + | |apache|1| | ||
| + | |servidor-sql|0| | ||
| + | |sap-db|0| | ||
| + | |||
| + | |||
| + | Para conocer el estado de un servicio, independientemente de los hosts en los que se encuentre disponible | ||
| + | |||
| + | En este caso el servicio **HTTP** | ||
| + | |||
| + | <code sql> | ||
| + | SELECT obj1.name1 AS host_name, | ||
| + | nagios_services.service_object_id, | ||
| + | obj1.name2 AS service_description, | ||
| + | nagios_servicestatus.current_state | ||
| + | FROM `nagios_servicestatus` | ||
| + | LEFT JOIN nagios_objects AS obj1 ON nagios_servicestatus.service_object_id = obj1.object_id | ||
| + | LEFT JOIN nagios_services ON nagios_servicestatus.service_object_id = nagios_services.service_object_id | ||
| + | LEFT JOIN nagios_instances ON nagios_services.instance_id = nagios_instances.instance_id | ||
| + | WHERE nagios_services.config_type = ' | ||
| + | AND obj1.name2 = ' | ||
| + | </ | ||
| + | |||
| + | Resultando en una tabla como esta | ||
| + | |||
| + | ^host_name^service_object_id^service_description^current_state^ | ||
| + | | concentrador_mpls | 18 | HTTP | 0 | | ||
| + | | router-vpn | 23| HTTP | 1| | ||
| + | | central | 28 | HTTP | 2 | | ||
| + | | router-45 | 33 | HTTP | 0 | | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | Consulta simple para obtener un pantallazo general del estado de servicios de un hostgroup | ||
| + | |||
| + | <code sql> | ||
| + | SELECT | ||
| + | CASE st.current_state | ||
| + | WHEN 0 THEN ' | ||
| + | WHEN 1 THEN ' | ||
| + | WHEN 2 THEN ' | ||
| + | WHEN 3 THEN ' | ||
| + | END AS states, | ||
| + | COUNT(st.current_state) AS number | ||
| + | FROM nagios_hostgroup_members m, nagios_services s, | ||
| + | nagios_servicestatus st | ||
| + | WHERE m.host_object_id = s.host_object_id | ||
| + | AND s.service_object_id = st.service_object_id | ||
| + | AND hostgroup_id IN | ||
| + | ( | ||
| + | SELECT hostgroup_id | ||
| + | FROM nagios_hostgroups hg, nagios_objects o | ||
| + | WHERE hg.hostgroup_object_id = o.object_id | ||
| + | AND o.name1 = ' | ||
| + | ) | ||
| + | GROUP BY st.current_state; | ||
| + | </ | ||
| + | |||
| + | Resultando en una tabla como esta | ||
| + | |||
| + | ^states^number^ | ||
| + | |OK|1754| | ||
| + | |WARNING|13| | ||
| + | |CRITICAL|84| | ||
| + | |UNKNOWN|20| | ||
| + | |||
| + | Consulta simple para obtener un conteo general de los estados generales ordenados por meses de un año determinado. | ||
| + | |||
| + | <code sql> | ||
| + | SELECT | ||
| + | CONCAT('', | ||
| + | ELT(nagios_statehistory.state+1,' | ||
| + | CONCAT('', | ||
| + | FROM | ||
| + | `nagios_statehistory` | ||
| + | LEFT JOIN nagios_objects AS obj1 ON nagios_statehistory.object_id=obj1.object_id | ||
| + | LEFT JOIN nagios_instances ON nagios_statehistory.instance_id=nagios_instances.instance_id | ||
| + | WHERE | ||
| + | obj1.objecttype_id=' | ||
| + | AND nagios_statehistory.state_type = 1 | ||
| + | AND DATE_FORMAT(nagios_statehistory.state_time,' | ||
| + | GROUP BY | ||
| + | TEMPS, ETAT | ||
| + | ORDER BY | ||
| + | DATE_FORMAT(nagios_statehistory.state_time,' | ||
| + | </ | ||
| + | |||
| + | Resultando en una tabla como esta | ||
| + | |||
| + | ^TEMPS^ETAT^QUANTITE^ | ||
| + | |November|OK|1754| | ||
| + | |November|WARNING|13| | ||
| + | |November|CRITICAL|84| | ||
| + | |November|UNKNOWN|20| | ||
| + | |||
| + | Trigger para guardar el último estado de los objetos | ||
| + | |||
| + | Nagios no guarda en ninguna tabla de MySQL el último estado de los objetos, pero guarda los cambios de estado en la tabla nagios_statehistory. Para mantener el último estado se puede usar un trigger: | ||
| + | |||
| + | <code sql> | ||
| + | create table last_state (object_id int(11), state int(6)); | ||
| + | |||
| + | create trigger last_state after insert on nagios_statehistory | ||
| + | for each row | ||
| + | begin | ||
| + | if new.state_change = 1 then | ||
| + | update last_state set state = new.state where object_id new.object_id; | ||
| + | end if; | ||
| + | end;// | ||
| + | </ | ||
| + | |||
| + | Ese trigger hace un update así que hay que cronear esto para mantener al día con los objetos la tabla. | ||
| + | |||
| + | <code sql> | ||
| + | insert into last_state | ||
| + | select obj.object_id, | ||
| + | from nagios.nagios_objects as obj | ||
| + | where obj.object_id not in | ||
| + | (select object_id from last_state); | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | Luego estas consultas podemos integrarlas en PHP o Perl, y obtener resultados que necesitemos para reflejarlos en un visor web, o en los resultados de un plugin. | ||
| + | |||
| + | |||
| + | |||
| + | **NOTA:** Importante el modulo mysql de PHP no soporta la consulta a los PROCEDURE de MySQL, para ello deberemos utilizar el modulo mysqli de PHP, otra cosa tambien importante es que mysqli soporta conecciones persistentes, | ||
manuales/nagios/capacitacion/ndo2utils.1445533776.txt.gz · Última modificación: 2015/10/22 17:09 por cayu
