Herramientas de usuario

Herramientas del sitio


manuales:nagios:capacitacion:ndo2utils

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
manuales:nagios:capacitacion:ndo2utils [2015/10/22 17:10] cayumanuales:nagios:capacitacion:ndo2utils [2015/10/22 17:37] (actual) cayu
Línea 142: Línea 142:
 </code> </code>
  
 +=== MySQL ===
 +
 +MySQL es uno de los Sistemas Gestores de Bases de Datos Relacional multihilo y multiusuario, más populares, 
 +
 +== Compilacion ==
 +
 +Debemos descargar el paquete de su web oficial y proceder a compilarlo.
 +
 +<code>
 +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=/usr/local/mysql
 +root@localhost # make
 +root@localhost # make install
 +root@localhost # cp support-files/my-medium.cnf /etc/my.cnf
 +root@localhost # cd /usr/local/mysql
 +root@localhost # bin/mysql_install_db --user=mysql
 +root@localhost # chown -R root  .
 +root@localhost # chown -R mysql var
 +root@localhost # chgrp -R mysql .
 +root@localhost # bin/mysqld_safe --user=mysql &
 +</code>
 +
 +== Establecer la contraseña del usuario root ==
 +
 +
 +Por defecto, el usuario root no tiene asignada una contraseña y esto no es nada recomendable, así que vamos a establecer una. Utilizamos el comando:
 +
 +
 +//mysqladmin -u root password 'contraseñadificil'//
 +
 +
 +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, la tecleamos, y si todo es correcto entraremos en la interfaz del cliente de MySQL, podemos teclear algún comando de mysql para interactuar con el servidor, por ejemplo:
 +
 +
 +//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
 +
 +//mysql>create database nagios;//
 +
 +<code>
 +Query OK, 1 row affected (0.00 sec)
 +mysql>show databases;
 +
 ++----------+
 +| Database |
 ++----------+
 +| mysql    |
 +| nagios   |
 +| test     |
 ++----------+
 +3 rows in set (0.01 sec)
 +</code>
 +
 +
 +Ahora deberemos crear un usuario con privilegios de SELECT, INSERT, UPDATE, DELETE
 +
 +<code>
 +CREATE USER nagios IDENTIFIED BY 'nagios123';
 +</code>
 +
 +Y darle privilegios sobre la base de datos nagios
 +
 +<code>
 +mysql> GRANT ALL ON nagios.* TO nagios@localhost IDENTIFIED BY "nagios";
 +Query OK, 0 rows affected (0.00 sec)
 +
 +mysql> quit
 +</code>
 +
 +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 :
 +
 +///etc/init.d/mysql start//
 +
 +Y para setear su arranque por defecto :
 +
 +//update-rc.d -f mysql defaults//
 +
 +
 +** Nota SuSE **
 +
 +Para setear el arranque de un servicio en SuSE Linux deberemos ejecutar el comando //insserv -d nombre_servicio// con el parametro //-d// estariamos indicando una opcion similar a //defaults// como en Debian.
 +
 +
 +
 +=== 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_instances,
 +    nagios_hosts,nagios_hostgroup_members,
 +    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 = '{grupo_de_host_a_consultar}'
 +    ORDER BY nagios_hosts.display_name ASC
 +</code>
 +
 +Para conocer el estado de un servicio de un determinado host
 +
 +<code sql>
 +    SELECT
 +    nagios_servicestatus.perfdata,nagios_servicestatus.output
 +    FROM
 +    nagios_services,nagios_servicestatus,
 +    nagios_objects,nagios_instances
 +    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 = '{servicio_a_consultar}'
 +    AND
 +    nagios_services.config_type='1'
 +    AND
 +    nagios_objects.name1 = '{host_que_lo_contiene}'
 +</code>
 +
 +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='1'
 +    AND
 +    nagios_hosts.display_name = '{host_a_consultar}'
 +</code>
 +
 +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 ='{alias_service_group}'
 +    AND nagios_services.display_name ='{alias_de_servicio}'
 +</code>
 +
 +Para conocer los estados de los hosts
 +
 +<code sql>
 +SELECT nagios_hosts.display_name,nagios_hoststatus.current_state  
 +FROM   nagios_hoststatus,nagios_hosts 
 +WHERE  nagios_hoststatus.host_object_id = nagios_hosts.host_object_id;
 +</code>
 +
 +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 = '1'
 +AND obj1.name2 = 'HTTP'
 +</code>
 +
 +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 'OK' 
 +       WHEN 1 THEN 'WARNING' 
 +       WHEN 2 THEN 'CRITICAL' 
 +       WHEN 3 THEN 'UNKNOWN' 
 +    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 = '{nombre_hostgroup}'
 +        )
 +GROUP BY st.current_state;
 +</code>
 +
 +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('',DATE_FORMAT(nagios_statehistory.state_time,'%M')) AS TEMPS,
 + ELT(nagios_statehistory.state+1,'OK','WARNING','CRITICAL','UNKNOWN') AS ETAT,
 + CONCAT('',COUNT(nagios_statehistory.state)) AS QUANTITE
 +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='2'
 + AND nagios_statehistory.state_type = 1
 + AND DATE_FORMAT(nagios_statehistory.state_time,'%Y') = 2010
 +GROUP BY
 + TEMPS, ETAT
 +ORDER BY
 + DATE_FORMAT(nagios_statehistory.state_time,'%m'),nagios_statehistory.state
 +</code>
 +
 +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;// 
 +</code>
 +
 +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, 0
 +        from nagios.nagios_objects as obj
 +        where obj.object_id not in
 +                (select object_id from last_state);
 +</code>
 +
 +
 +
 +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, asi que para evitarse tiempo de implementacion a veces es necesario o implementar un script en Perl, o hacer que el resultado del PROCEDURE se almacene en una tabla temporal y realizar una consulta simple desde ahi.
manuales/nagios/capacitacion/ndo2utils.1445533857.txt.gz · Última modificación: 2015/10/22 17:10 por cayu