En muchas ocasiones tendremos que ejecutar un comando creado por nosotros al cual tenemos que agregarle argumentos para chequear:
Ejemplo:
/home/commands/check_nrpe -H 192.168.0.2 -p 5666 -c check_cimage -a 1233 122
Esto nos devolverá error porque no soporta argumentos.
para habilitar los argumentos enviados por NRPE cuando se compile nrpe se debe ejecutar con la siguiente instrucción:
./configure --enable-command-args
básicamente esto lo pongo porque me trajo muchos dolores de cabeza y se que lo voy a volver a necesitar y me voy a volver a olvidar.
Hernan Mazzeo
miércoles, 30 de septiembre de 2009
HOW-TO - CREANDO UN PLUGIN PARA NAGIOS
El nagios ya tiene varios plugins que se pueden descargar desde la página oficial.
No obstante en muchos casos tenemos que realizar chequeos especificos que no se pueden realizar con los plugins genericos.
Por eso y porque un compañero vino hoy a preguntar como carajo hacía para hacer un chequeo que le habíamos pedido (Pepo, nuestro experimento fue un exito).
Los script pueden realizarse en cualquier lenguaje que pueda ejecutarse desde consola.
La lógica se puede hacer con un script común teniendo en cuenta que lo mas importante es lo que muestra en la salida y el exit que tenga siguiendo las relaciones de :
exit 0 - OK
exit 1 - WARNING
exit 2 - CRITICAL
Un ejemplo en bash para chequear si se están almacenando correctamente las imagenes de un determinado dispositivo:
#/bin/bash
#Le paso como argumento el nombre del monitor
MONITOR=$1
CMINIMA=$2
DIR_TEMP="/home/commands/tmp";
USER="root"
PASS="password"
BD="base"
#Obtengo el ID de la Camara
IDCAM=`echo "SELECT Id FROM tabla1 WHERE Name = '${MONITOR}'" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
#Con el ID de la camara saco el ultimo evento cerrado y la cantidad de imagenes
UECLOSE=`echo "select Frames from tabla2 where MonitorId='${IDCAM}' and EndTime is not null order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
UECLOSEDATE=`echo "select StartTime from tabla2 where MonitorId='${IDCAM}' order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
UE=`echo "select Id from Events where MonitorId='${IDCAM}' order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
UESTORE=`cat $DIR_TEMP/ULTIMO_VENTO_$IDCAM`;
if [ $UE -eq $UESTORE ]
then
UFTAM=`du -sk /var/www/html/events/${IDCAM}/${UE} | awk '{print $1}'`;
AFTAM=`cat $DIR_TEMP/GRABA_CAM_$IDCAM`;
echo $UFTAM > $DIR_TEMP/GRABA_CAM_$IDCAM
if [ $UFTAM -eq $AFTAM ]
then
RESPONDE="7";
else
RESPONDE="9";
fi
else
UFTAM=`du -sk /var/www/html/events/${IDCAM}/${UE} | awk '{print $1}'`;
echo $UFTAM > $DIR_TEMP/GRABA_CAM_$IDCAM
RESPONDE="9";
fi
#echo "---------------------------";
#echo "DEBUG";
#echo "---------------------------";
#echo "ULTIMO EVENTO" $UESTORE
#echo "EVENTO ACTUAL" $UE
#echo "TAMANO ANTERIOR" $UFTAM
#echo "TAMANO ACTUAL" $AFTAM
#echo "ESTADO DE GRABACIONES" $RESPONDE;
#echo "---------------------------";
echo $UE > $DIR_TEMP/ULTIMO_VENTO_$IDCAM
if [ $RESPONDE -eq 9 ]
then
if [ $UECLOSE -lt $CMINIMA ]
then
echo "ALERTA - ${UECLOSE} IMAGENES EN EL ULTIMO EVENTO CERRADO";
exit 1
echo "OK - ${UECLOSE} IMAGENES / ${UECLOSEDATE} FECHA ULTIMO EVENTO";
exit 0
else
echo "OK - ${UECLOSE} IMAGENES / ${UECLOSEDATE} FECHA ULTIMO EVENTO HM";
exit 0
fi
else
RCAM = `/usr/local/bin/zmdc.pl restart zmc -m $IDCAM`;
echo "ALERTA - UE:${UESTORE} / ${UECLOSEDATE} FECHA ULTIMO EVENTO";
exit 2
fi
Esto lo ponemos dentro de un archivo que se situará (en instalación default) /usr/local/nagios/libexec/
Se le darán permisos de ejecución correspondientes y se lo asociará al grupo que lo pueda ejecutar sin problemas.
Una vez realizado esto se debe generar el comando:
/usr/local/nagios/objects/commands.cfg
define command{
command_name check_cimage
command_line /home/commands/check_cimage $ARG1$ $ARG2$
}
Con eso se realizará el chequeo que necesitemos sin problemas.
Hernán Mazzeo
No obstante en muchos casos tenemos que realizar chequeos especificos que no se pueden realizar con los plugins genericos.
Por eso y porque un compañero vino hoy a preguntar como carajo hacía para hacer un chequeo que le habíamos pedido (Pepo, nuestro experimento fue un exito).
Los script pueden realizarse en cualquier lenguaje que pueda ejecutarse desde consola.
La lógica se puede hacer con un script común teniendo en cuenta que lo mas importante es lo que muestra en la salida y el exit que tenga siguiendo las relaciones de :
exit 0 - OK
exit 1 - WARNING
exit 2 - CRITICAL
Un ejemplo en bash para chequear si se están almacenando correctamente las imagenes de un determinado dispositivo:
#/bin/bash
#Le paso como argumento el nombre del monitor
MONITOR=$1
CMINIMA=$2
DIR_TEMP="/home/commands/tmp";
USER="root"
PASS="password"
BD="base"
#Obtengo el ID de la Camara
IDCAM=`echo "SELECT Id FROM tabla1 WHERE Name = '${MONITOR}'" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
#Con el ID de la camara saco el ultimo evento cerrado y la cantidad de imagenes
UECLOSE=`echo "select Frames from tabla2 where MonitorId='${IDCAM}' and EndTime is not null order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
UECLOSEDATE=`echo "select StartTime from tabla2 where MonitorId='${IDCAM}' order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
UE=`echo "select Id from Events where MonitorId='${IDCAM}' order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
UESTORE=`cat $DIR_TEMP/ULTIMO_VENTO_$IDCAM`;
if [ $UE -eq $UESTORE ]
then
UFTAM=`du -sk /var/www/html/events/${IDCAM}/${UE} | awk '{print $1}'`;
AFTAM=`cat $DIR_TEMP/GRABA_CAM_$IDCAM`;
echo $UFTAM > $DIR_TEMP/GRABA_CAM_$IDCAM
if [ $UFTAM -eq $AFTAM ]
then
RESPONDE="7";
else
RESPONDE="9";
fi
else
UFTAM=`du -sk /var/www/html/events/${IDCAM}/${UE} | awk '{print $1}'`;
echo $UFTAM > $DIR_TEMP/GRABA_CAM_$IDCAM
RESPONDE="9";
fi
#echo "---------------------------";
#echo "DEBUG";
#echo "---------------------------";
#echo "ULTIMO EVENTO" $UESTORE
#echo "EVENTO ACTUAL" $UE
#echo "TAMANO ANTERIOR" $UFTAM
#echo "TAMANO ACTUAL" $AFTAM
#echo "ESTADO DE GRABACIONES" $RESPONDE;
#echo "---------------------------";
echo $UE > $DIR_TEMP/ULTIMO_VENTO_$IDCAM
if [ $RESPONDE -eq 9 ]
then
if [ $UECLOSE -lt $CMINIMA ]
then
echo "ALERTA - ${UECLOSE} IMAGENES EN EL ULTIMO EVENTO CERRADO";
exit 1
echo "OK - ${UECLOSE} IMAGENES / ${UECLOSEDATE} FECHA ULTIMO EVENTO";
exit 0
else
echo "OK - ${UECLOSE} IMAGENES / ${UECLOSEDATE} FECHA ULTIMO EVENTO HM";
exit 0
fi
else
RCAM = `/usr/local/bin/zmdc.pl restart zmc -m $IDCAM`;
echo "ALERTA - UE:${UESTORE} / ${UECLOSEDATE} FECHA ULTIMO EVENTO";
exit 2
fi
Esto lo ponemos dentro de un archivo que se situará (en instalación default) /usr/local/nagios/libexec/
Se le darán permisos de ejecución correspondientes y se lo asociará al grupo que lo pueda ejecutar sin problemas.
Una vez realizado esto se debe generar el comando:
/usr/local/nagios/objects/commands.cfg
define command{
command_name check_cimage
command_line /home/commands/check_cimage $ARG1$ $ARG2$
}
Con eso se realizará el chequeo que necesitemos sin problemas.
Hernán Mazzeo
INCURSIONANDO EN PLSQL (ORACLE 10g)
En la empresa donde trabajo, terminamos hace poco una implementación de una plataforma para la administración de Call Centers.
Esta plataforma se llama CCA y es de Oracle.
Mi responsabilidad en el proyecto era la integración con el sistema CRM con el que actualmente trabajamos.
Una de las partes fue la actualización de la base de datos y debiamos hacerlo sin que la tabla se quede en 0 en ningun momento, ya que esta tabla es con la que consulta la plataforma para que el cliente ingrese al sistema.
A continuación vamos a explicar la lógica y el mecanismo ya que puede servir para otras aplicaciones:
ORACLE TO ORACLE:
1) Dentro de CCA creamos un DBLINK a la vista de nuestro CRM.
2) Dentro de CCA creamos la tabla IVR_CLIENTES (esta será la que contenga los datos que traigamos de nuestro CRM.
3) Dentro de CCA creamos una tabla IVR_CLIENTES_TMPO, la misma se utilizará de temporal.
4) Para actualizar cada 2 horas básicamente teníamos que armar un plsql que modifique el nombre de las tablas y evite tener que borrar los datos para cargarlos nuevamente (lo que generaría un vacio con posibles error de autentificación).
creamos un archivo ejecuta.sql.
adentro ponemos el siguiente codigo:
Obviar comentarios en rojo, son solo para indicar que se hizo.
Declaro variables
DECLARE
c_registros_A NUMBER(10);
c_registros_B NUMBER(10);
sql_drop VARCHAR2(255);
sql_alter VARCHAR2(255);
sql_create VARCHAR2(255);
sql_truncate VARCHAR2(255);
Hago un insert into select, consiste en hacer un insert en base a un select a otra tabla, en este caso un dblink con el formato CLIENTES_CRM_VIEW@TFLP
BEGIN
INSERT INTO IVR_CLIENTES_TMPO SELECT * FROM IVR_CLIENTES_CRM_VIEW@TFLP;
Básicamente aca cuento los registros, teniendo en cuenta que esta base siempre debe crecer y jamás tener menos registros.
SELECT COUNT(*) INTO c_registros_A FROM IVR_CLIENTES;
SELECT COUNT(*) INTO c_registros_B FROM IVR_CLIENTES_TMPO;
Analizo si me traje mas registros que los que hay ahora.
IF c_registros_B >= c_registros_A THEN
Si es así borro la tabla anterior y modifico el nombre de la vieja.
sql_drop := 'DROP TABLE IVR_CLIENTES';
sql_alter := 'ALTER TABLE IVR_CLIENTES_TMPO RENAME TO IVR_CLIENTES';
Creo nuevamente la base temporal para la próxima corrida.
sql_create := 'CREATE TABLE IVR_CLIENTES_TMPO AS SELECT * FROM IVR_CLIENTES';
Le borro el contenido.
sql_truncate := 'TRUNCATE TABLE IVR_CLIENTES_TMPO';
Ejecuto los comandos.
EXECUTE IMMEDIATE sql_drop;
EXECUTE IMMEDIATE sql_alter;
EXECUTE IMMEDIATE sql_create;
EXECUTE IMMEDIATE sql_truncate;
IMPORTANTE EL COMMITTTTTTT !!!!!!
COMMIT;
END IF;
END;
/
finalmente otro archivo que lo ejecute (utilizando sqlplus):
replica.sh
#!/bin/bash
sqlplus -l REP_10CRM/password@ORCL @ejecuta.sql <
EXIT
y lo croneamos:
[oracle@cca-db1 ~]$ crontab -l
* */1 * * * /bin/sh /home/oracle/replica.sh
Hernán Mazzeo
Esta plataforma se llama CCA y es de Oracle.
Mi responsabilidad en el proyecto era la integración con el sistema CRM con el que actualmente trabajamos.
Una de las partes fue la actualización de la base de datos y debiamos hacerlo sin que la tabla se quede en 0 en ningun momento, ya que esta tabla es con la que consulta la plataforma para que el cliente ingrese al sistema.
A continuación vamos a explicar la lógica y el mecanismo ya que puede servir para otras aplicaciones:
ORACLE TO ORACLE:
1) Dentro de CCA creamos un DBLINK a la vista de nuestro CRM.
2) Dentro de CCA creamos la tabla IVR_CLIENTES (esta será la que contenga los datos que traigamos de nuestro CRM.
3) Dentro de CCA creamos una tabla IVR_CLIENTES_TMPO, la misma se utilizará de temporal.
4) Para actualizar cada 2 horas básicamente teníamos que armar un plsql que modifique el nombre de las tablas y evite tener que borrar los datos para cargarlos nuevamente (lo que generaría un vacio con posibles error de autentificación).
creamos un archivo ejecuta.sql.
adentro ponemos el siguiente codigo:
Obviar comentarios en rojo, son solo para indicar que se hizo.
Declaro variables
DECLARE
c_registros_A NUMBER(10);
c_registros_B NUMBER(10);
sql_drop VARCHAR2(255);
sql_alter VARCHAR2(255);
sql_create VARCHAR2(255);
sql_truncate VARCHAR2(255);
Hago un insert into select, consiste en hacer un insert en base a un select a otra tabla, en este caso un dblink con el formato CLIENTES_CRM_VIEW@TFLP
BEGIN
INSERT INTO IVR_CLIENTES_TMPO SELECT * FROM IVR_CLIENTES_CRM_VIEW@TFLP;
Básicamente aca cuento los registros, teniendo en cuenta que esta base siempre debe crecer y jamás tener menos registros.
SELECT COUNT(*) INTO c_registros_A FROM IVR_CLIENTES;
SELECT COUNT(*) INTO c_registros_B FROM IVR_CLIENTES_TMPO;
Analizo si me traje mas registros que los que hay ahora.
IF c_registros_B >= c_registros_A THEN
Si es así borro la tabla anterior y modifico el nombre de la vieja.
sql_drop := 'DROP TABLE IVR_CLIENTES';
sql_alter := 'ALTER TABLE IVR_CLIENTES_TMPO RENAME TO IVR_CLIENTES';
Creo nuevamente la base temporal para la próxima corrida.
sql_create := 'CREATE TABLE IVR_CLIENTES_TMPO AS SELECT * FROM IVR_CLIENTES';
Le borro el contenido.
sql_truncate := 'TRUNCATE TABLE IVR_CLIENTES_TMPO';
Ejecuto los comandos.
EXECUTE IMMEDIATE sql_drop;
EXECUTE IMMEDIATE sql_alter;
EXECUTE IMMEDIATE sql_create;
EXECUTE IMMEDIATE sql_truncate;
IMPORTANTE EL COMMITTTTTTT !!!!!!
COMMIT;
END IF;
END;
/
finalmente otro archivo que lo ejecute (utilizando sqlplus):
replica.sh
#!/bin/bash
sqlplus -l REP_10CRM/password@ORCL @ejecuta.sql <
EXIT
y lo croneamos:
* */1 * * * /bin/sh /home/oracle/replica.sh
Hernán Mazzeo
Suscribirse a:
Entradas (Atom)