Herramientas de usuario

Herramientas del sitio


manuales:nagios:capacitacion:desarrollo_de_plugins_de_nagios

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:desarrollo_de_plugins_de_nagios [2015/10/22 14:51] cayumanuales:nagios:capacitacion:desarrollo_de_plugins_de_nagios [2016/07/27 15:12] (actual) cayu
Línea 1: Línea 1:
 ====== Desarrollo de plugins de Nagios ====== ====== Desarrollo de plugins de Nagios ======
 +==== Programando plugins ====
 +
 +Desarrollar plugins de chequeos para Nagios es extremadamente flexible, ya que no dependemos del lenguaje de programación debido a que Nagios toma la salida resultante de su ejecución.
 +
 +
 +Deberemos conocer bien lo que queremos chequear y conocer los indicadores que nos mostraran si deberemos expresarlos como un OK, un WARNING o un CRITICAL.
 +
 +
 +Luego deberemos reflejar esos estados en su código de retorno o Exit status, dependiendo del código del mismo Nagios entenderá que debe mostrar.
 +
 +^Exit status^Estado de Servicio^Estado de Host^Descripcion^
 +|0|OK|UP|El plugin es capaz de verificar el servicio y que parece estar funcionando correctamente|
 +|1|WARNING|UP/DOWN/UNREACHABLE|El plugin es capaz de verificar el servicio, pero que parecía estar por encima de un umbral de "advertencia" o parece no estar funcionando correctamente|
 +|2|CRITICAL|DOWN/UNREACHABLE|El plugin detecta que o bien el servicio no funciona o que está por encima de un umbral "crítico"|
 +|3|UNKNOWN|DOWN/UNREACHABLE|Argumentos de línea de comandos no válida o fallas internas del plugin (por ejemplo error en un socket o dns) que le impiden realizar las operaciones especificadas|
 +
 +
 +**Añadir nuestro plugin**
 +
 +Para añadir nuestro plugin a Nagios
 +  * Deberemos copiar nuestro ejecutable (ya sea script o binario) al directorio ///usr/local/nagios/libexec// con permisos de ejecución.
 +  * Crearle una entrada dentro del archivo de configuración de Comandos.
 +  * Crear un Servicio y asignarle ese comando para que se encargue de dicho chequeo.
 +
 +**Notas sobre el desarrollo de plugins**
 +
 +  * No ejecutar comandos del sistema, sin especificar su ruta de acceso completa.
 +    * Utilice spopen () si deben ser ejecutados comando externos en su plugin en C.
 +    * Ver los principales ejemplos de plugin para ver cómo se hace esto.
 +  * No haga archivos temporales a menos que sea absolutamente necesario.
 +    * Si se necesitan archivos temporales, asegúrese de que el plugin y elimine el archivo temporal, cuando finalice.
 +  * No se deje engañar por enlaces simbólicos
 +    * Si el plug-in abre todos los archivos, tomar medidas para asegurarse de que no están siguiendo un enlace simbólico a otro lugar en el sistema.
 +  * Validar todas las entradas
 +  * Usar rutinas en utils.c utils.pm o escribir más según sea necesario 
 +
 +
 +**Referencias sobre el desarrollo de plugins**
 +
 +
 +http://nagios.sourceforge.net/docs/3_0/pluginapi.html
 +
 +
 +http://nagiosplug.sourceforge.net/developer-guidelines.html
 +
 +
 +=== Ejemplo de consulta de un puerto TCP con Perl por medio de IO::Socket::INET ===
 +
 +**check_port.pl $HOSTADDRESS$ $ARG1$**
 +
 +<code perl>
 +#!/usr/bin/perl
 +
 +use IO::Socket::INET;
 +my $IP = $ARGV[0];
 +my $PORT = $ARGV[1];
 +my $STATUS = "0"; 
 +my $sock = new IO::Socket::INET->new(
 +         PeerAddr => $IP,
 +         PeerPort => $PORT,
 +         Proto => 'tcp',
 +         );
 +         $sock or $STATUS = "2";
 +
 +if ( $STATUS eq 0 ) {
 +   print "El puerto $ARGV[1] esta OK";
 +   exit 0;
 +} else {
 +   print "No puedo abrir el puerto $ARGV[1] WARNING";
 +   exit 2;
 +   die;
 +
 +</code>
 ==== Ejemplo de plugins SNMP ==== ==== Ejemplo de plugins SNMP ====
 +== Plugin consultando SNMP ==
 +
 +Dado el caso que queramos obtener información interna de determinado Host y necesitemos que este disponible para consultarla por SNMP, podemos incluir dicha informacion. Para ellos deberemos incluir diferentes directivas de configuracion en el archivo //snmpd.conf//, y haremos uso de la tabla externa del objeto UCD. La //Tabla externa UCD// es una tabla extensible de comandos de la cual obtendremos su código de resultado de ejecución y su salida.
 +
 +
 +**/etc/snmp/snmpd.conf**
 +
 +<code>
 +syslocation Unknown (configure /etc/snmp/snmpd.local.conf)
 +syscontact Root <root@localhost> (configure /etc/snmp/snmpd.local.conf)
 +
 +exec comando1 /bin/comando1
 +exec comando2 /bin/comando2
 +exec comando3 /bin/comando3
 +exec comando3 /bin/comando4
 +
 +rouser consultorsnmp auth
 +#createUser consultorsnmp MD5 consultorsnmp123
 +</code>
 +
 +Luego podemos ver los resultados obtenidos realizando una consulta SNMP a //UCD-SNMP-MIB::extTable// o //.1.3.6.1.4.1.2021.8//, obteniendo resultados similares a :
 +
 +
 +**snmpwalk -v 3 -l authNoPriv -a MD5 -u consultorsnmp -A consultorsnmp123 127.0.0.1  UCD-SNMP-MIB::extTable***
 +<code>
 +UCD-SNMP-MIB::extIndex.1 = INTEGER: 1
 +UCD-SNMP-MIB::extIndex.2 = INTEGER: 2
 +UCD-SNMP-MIB::extIndex.3 = INTEGER: 3
 +UCD-SNMP-MIB::extIndex.4 = INTEGER: 4
 +UCD-SNMP-MIB::extNames.1 = STRING: comando1
 +UCD-SNMP-MIB::extNames.2 = STRING: comando2
 +UCD-SNMP-MIB::extNames.3 = STRING: comando3
 +UCD-SNMP-MIB::extNames.4 = STRING: comando4
 +UCD-SNMP-MIB::extCommand.1 = STRING: /bin/comando1
 +UCD-SNMP-MIB::extCommand.2 = STRING: /bin/comando2
 +UCD-SNMP-MIB::extCommand.3 = STRING: /bin/comando3
 +UCD-SNMP-MIB::extCommand.4 = STRING: /bin/comando4
 +UCD-SNMP-MIB::extResult.1 = INTEGER: 0
 +UCD-SNMP-MIB::extResult.2 = INTEGER: 0
 +UCD-SNMP-MIB::extResult.3 = INTEGER: 0
 +UCD-SNMP-MIB::extResult.4 = INTEGER: 0
 +UCD-SNMP-MIB::extOutput.1 = STRING: salida-comando
 +UCD-SNMP-MIB::extOutput.2 = STRING: salida-comando
 +UCD-SNMP-MIB::extOutput.3 = STRING: salida-comando
 +UCD-SNMP-MIB::extOutput.4 = STRING: salida-comando
 +UCD-SNMP-MIB::extErrFix.1 = INTEGER: 0
 +UCD-SNMP-MIB::extErrFix.2 = INTEGER: 0
 +UCD-SNMP-MIB::extErrFix.3 = INTEGER: 0
 +UCD-SNMP-MIB::extErrFix.4 = INTEGER: 0
 +UCD-SNMP-MIB::extErrFixCmd.1 = STRING:
 +UCD-SNMP-MIB::extErrFixCmd.2 = STRING:
 +UCD-SNMP-MIB::extErrFixCmd.3 = STRING:
 +UCD-SNMP-MIB::extErrFixCmd.4 = STRING:
 +</code>
 +
 +Ramas SNMP : 
 +
 +  * UCD-SNMP-MIB::extNames
 +    * En esta rama obtendremos el nombre que le hemos asignado a dicho comando
 +  * UCD-SNMP-MIB::extCommand
 +    * Esta rama nos devolvera la ruta completa al ejecutable del comando
 +  * UCD-SNMP-MIB::extResult
 +    * Nos devolvera el resultado de la ejecucion del comando fue exitosa o no, devolviendonos su //exit status//
 +  * UCD-SNMP-MIB::extOutput
 +    * Aqui obtendremos la salida del comando con el string o expresion que necesitemos conocer
 +
 +
 +
 +**Referencias sobre consultas SNMP a la tabla UCD**
 +
 +http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html
 +
 +
 +
 +=== Ejemplo de consulta SNMP con Perl por medio de Net::SNMP ===
 +
 +Ejemplo simple de como consultar una variable SNMPv1.
 +
 +<code perl>
 +#!/usr/local/bin/perl
 +use strict;
 +use warnings;
 +use Net::SNMP;
 +
 +my $OID_sysUpTime = '1.3.6.1.2.1.1.3.0';
 +
 +my ($session, $error) = Net::SNMP->session(
 +    -hostname  => shift || '127.0.0.1',
 +    -community => shift || 'public',
 +);
 +
 +if (!defined $session) {
 +    printf "ERROR: %s.\n", $error;
 +    exit 1;
 +}
 +
 +my $result = $session->get_request(-varbindlist => [ $OID_sysUpTime ],);
 +
 +if (!defined $result) {
 +    printf "ERROR: %s.\n", $session->error();
 +    $session->close();
 +    exit 1;
 +}
 +
 +printf "The sysUpTime for host '%s' is %s.\n",
 +$session->hostname(), $result->{$OID_sysUpTime};
 +
 +$session->close();
 +
 +exit 0;
 +</code>
 +
 +Ejemplo simple de como consultar una variable SNMPv3, igualmente se pueden consultar mas de una variable por sesion. En este caso estamos consultado la variable extOutput.1 para ver la salida del primer comando.
 +
 +<code perl>
 +#!/usr/bin/perl
 +use Net::SNMP;
 +$oid = ".1.3.6.1.4.1.2021.8.1.101.1";
 +
 +$snmpv3_username = "consultorsnmp";    # SNMPv3 username
 +$snmpv3_password = "consultorsnmp123"; # SNMPv3 password
 +$snmpv3_authprotocol = "md5";          # SNMPv3 hash algorithm (md5 / sha)
 +$snmpv3_privpassword = "";             # SNMPv3 hash algorithm (md5 / sha)
 +$snmpv3_privprotocol = "des";          # SNMPv3 encryption protocol (des / aes / aes128)
 +$version = "3";
 +$timeout = "2";
 +$hostname = "127.0.0.1";
 +# Crear la sesion SNMP
 +        ($s, $e) = Net::SNMP->session(
 +                -username       =>  $snmpv3_username,
 +                -authpassword   =>  $snmpv3_password,
 +                -authprotocol   =>  $snmpv3_authprotocol,
 +                -hostname       =>  $hostname,
 +                -version        =>  $version,
 +                -timeout        =>  $timeout,
 +        );
 +        if ($s){
 +        } else {
 +            print "CRITICAL - El agente no responde, SNMP v3 ($e)\n";
 +            exit(2);
 +        }
 +    $s->get_request($oid);
 +        foreach ($s->var_bind_names()) {
 +            $oid_consulta   = $s->var_bind_list()->{$_};
 +        }
 +$s->close();
 +print $oid_consulta;
 +</code>
 +
 +== Plugin ejecutando comando por SNMP ==
 +
 snmpd.conf snmpd.conf
 <code> <code>
Línea 15: Línea 239:
  
 $snmpv3_username = "nagios";    # SNMPv3 username $snmpv3_username = "nagios";    # SNMPv3 username
-$snmpv3_password = "ClaV3RfsTtD2"; # SNMPv3 password+$snmpv3_password = "claveNagios"; # SNMPv3 password
 $snmpv3_authprotocol = "md5";          # SNMPv3 hash algorithm (md5 / sha) $snmpv3_authprotocol = "md5";          # SNMPv3 hash algorithm (md5 / sha)
 $snmpv3_privpassword = "";             # SNMPv3 hash algorithm (md5 / sha) $snmpv3_privpassword = "";             # SNMPv3 hash algorithm (md5 / sha)
manuales/nagios/capacitacion/desarrollo_de_plugins_de_nagios.1445525507.txt.gz · Última modificación: 2015/10/22 14:51 por cayu