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