Inicio Linux & Systems Networks & Infrastructure Cybersecurity Cloud & DevOps SIEM & Monitoring DFIR & Threat Intel Development & Other Todas las categorias Herramientas

Script para automatizar monitorización en nagios

Script para automatizar monitorización en nagios

Tabla de contenidos

En esta ocasión traigo un pequeño script en el cual podemos dar de alta un nuevo proyecto y realizar la monitorización básica de servidores GNU/Linux y Windows

Este script consta de dos partes, la creación de un nuevo proyecto y la agregación de servidores para monitorizar en un proyecto.

Antes de nada debemos agregar los siguientes templates en la ruta /usr/local/nagios/templates (hosts.cfg, template.cfg, templatesrvlinux.cfg y templatesrvwin.cfg)

fichero  /usr/local/nagios/templates/hosts.cfg

bash
#Hostgroup Definition
define hostgroup {

hostgroup_name todos-PROYECTO-ENTORNO

alias Todos los servidores de PROYECTO

members SERVIDOR

notes_url URLWIKI

}
#Ping to hosts
define service {

use PROYECTO-serv-ENTORNO

hostgroup_name todos-PROYECTO-ENTORNO

service_description PROYECTO – ping

check_command check_ping!100.0,10%!500.0,20%

}

fichero  /usr/local/nagios/templates/template.cfg

bash
###############################################################################

###############################################################################

#

# CONTACT TEMPLATES

#

###############################################################################

###############################################################################
define contact{

contact_name PROYECTO

alias PROYECTO

service_notification_period 24×7

host_notification_period 24×7

service_notification_options u,c,r

host_notification_options d,u,r

service_notification_commands notify-service-by-email

host_notification_commands notify-host-by-email

email CONTACTEMAIL

}
define contactgroup{

contactgroup_name grupo-PROYECTO

alias Grupo de PROYECTO

members PROYECTO

}
###############################################################################

################################################################################

##

## HOST TEMPLATES

##

################################################################################

################################################################################
define host {

name PROYECTO-host-ENTORNO

flap_detection_enabled 1

notification_period 24×7

notification_options d,u,r

retain_status_information 1

retain_nonstatus_information 1

contact_groups grupo-PROYECTO

check_command check-host-alive

max_check_attempts 3

register 0

# notes_url URLWIKI

}
###############################################################################

################################################################################

##

## SERVICE TEMPLATES

##

################################################################################

################################################################################
define service {

name PROYECTO-serv-ENTORNO

check_period 24×7

flap_detection_enabled 1

notification_period 24×7

notification_options w,c,r

notification_interval 15

parallelize_check 1

retain_status_information 1

retain_nonstatus_information 1

max_check_attempts 3

normal_check_interval 3

retry_check_interval 1

contact_groups grupo-PROYECTO

register 0

}

fichero  /usr/local/nagios/templates/templatesrvlinux.cfg

bash
define service {

use PROYECTO-serv-ENTORNO

host_name SERVIDOR

service_description SSH [No llamar a guardia]

check_command check_tcp!22

}

define service {

use PROYECTO-serv-ENTORNO

host_name SERVIDOR

service_description puerto apache TCP 80 [No llamar a guardia]

check_command check_tcp!80

}
define service {

use PROYECTO-serv-ENTORNO

host_name SERVIDOR

service_description Uso MEM [No llamar a guardia]

check_command check_lnxmem_snmp_porcentaje!SNMPCOMMUNITY!95!90

}
define service {

use PROYECTO-serv-ENTORNO

host_name SERVIDOR

service_description Carga CPU [No llamar a guardia]

check_command check_lnx_cpu!SNMPCOMMUNITY!90!95

}
#define service {

# use PROYECTO-serv-ENTORNO

# host_name SERVIDOR

# service_description Proceso – apache httpd[No llamar a guardia]

# check_command check_process_snmp!SNMPCOMMUNITY!httpd!0,50!0,100

#}
#define service {

# use PROYECTO-serv-ENTORNO

# host_name SERVIDOR

# service_description [URL] http://www. [No llamar a guardia]

# check_command check_http_public_urlize_ruta_exp!http://www.url.com!www.url.com!/!HTTP/1.1 200

#

#}
#define service {

# use PROYECTO-serv-ENTORNO

# host_name SERVIDOR [No llamar a guardia]

# service_description [Comprobacion Cadena -Texto de la cadena a comprobar- en http://www.url.com]

# check_command check_cadena!http://www.url.com/!»Texto de la cadena a comprobar»

#

#

#}

fichero  /usr/local/nagios/templates/templatesrvwin.cfg

bash
define service {

use PROYECTO-serv-ENTORNO

host_name SERVIDOR

service_description Puerto 3389 [TS]

check_command check_tcp!3389

}
define service {

use PROYECTO-serv-ENTORNO

host_name SERVIDOR

service_description Uso CPU

check_command check_wincpu_snmp!SNMPCOMMUNITY!90!95
}
define service {

use PROYECTO-serv-ENTORNO

host_name SERVIDOR

service_description Uso MEM

check_command check_winmem_snmp!SNMPCOMMUNITY!MB!90%!95%
}
define service {

use PROYECTO-serv-ENTORNO

host_name SERVIDOR

service_description Disco C:

check_command check_disk_snmp!SNMPCOMMUNITY!C!MB!80%!90%

}
Una vez configurado todos los templates pasamos a los scripts, en primer lugar la creación de un nuevo proyecto.
cat /usr/bin/addproject.sh
#!/bin/bash
usage()

{

cat << EOF
USO: $0 -p proyecto -e entorno -u URL -A IP

Script para agregar nuevas URL al balanceador
OPCIONES:
-p Proyecto

-e Entorno (prov o dev )

-w Enlace documentacion

-m mail de contacto
ejemplo de uso: /usr/bin/addproject.sh -p balanceadores -e prod -w https://red-orbita.com/ -m rokitoh@red-robita.com
EOF

}
#Declaramos todas las variables que se van a usar para guardar los parametros

inputproject=

inputentorno=

inputwiki=

inputmail=
#Usamos el getopts para guardar los parametros en variables

while getopts «hH:p:e:w:» OPTION

do

case $OPTION in

h)

usage

exit 1

;;

p)

inputproject=$OPTARG

;;

e)

inputentorno=$OPTARG

;;

w)

inputwiki=$OPTARG

;;

m)

inputmail=$OPTARG

;
esac

done
#Comprobamos que se han introducido los parametros obligatorios

if [ -z $inputproject ] || [ -z $inputentorno ] || [ -z $inputwiki ] || [ -z $inputmail ]

then

usage

exit 1

fi
if [ $inputentorno != prod -a $inputentorno != dev ]

then
echo -e «\e[0;31m ERROR: no se definio correctamente el entorno. debe ser prod o dev \e[0m»
exit 1

fi
if [ -d /usr/local/nagios/etc/projects/$inputproject ];

then
echo -e «\e[0;31m ERROR: el proyecto /usr/local/nagios/etc/projects/$inputproject ya existe\e[0m»
exit 1
else
#Creamos el directorio del proyecto
mkdir /usr/local/nagios/etc/projects/$inputproject
#Copiamos el archivo template y hosts
cp /usr/local/nagios/templates/template.cfg /usr/local/nagios/etc/projects/$inputproject/

cp /usr/local/nagios/templates/hosts.cfg /usr/local/nagios/etc/projects/$inputproject/
#Configuramos el archivo hosts y template
sed -i -e «s|PROYECTO|$inputproject|g» /usr/local/nagios/etc/projects/$inputproject/template.cfg

sed -i -e «s|ENTORNO|$inputentorno|g» /usr/local/nagios/etc/projects/$inputproject/template.cfg

sed -i -e «s|URLWIKI|$inputwiki|g» /usr/local/nagios/etc/projects/$inputproject/template.cfg

sed -i -e «s|CONTACTEMAIL|$inputmail|g» /usr/local/nagios/etc/projects/$inputproject/template.cfg
sed -i -e «s|PROYECTO|$inputproject|g» /usr/local/nagios/etc/projects/$inputproject/hosts.cfg

sed -i -e «s|ENTORNO|$inputentorno|g» /usr/local/nagios/etc/projects/$inputproject/hosts.cfg

sed -i -e «s|URLWIKI|$inputwiki|g» /usr/local/nagios/etc/projects/$inputproject/hosts.cfg
fi

por ultimo solo queda el script el cual agrega nuevos servidores al proyecto.

javascript
cat /usr/bin/addmonitoring.sh
#!/bin/bash
usage()

{

cat << EOF
USO: $0 -p PUERTO -P PROYECTO -u URL -A IP

Script para agregar nuevas URL al balanceador
OPCIONES:
-p Proyecto

-e Entorno

-o Sistema operativo (linux o win)

-s Servidor

-i Direccion ip del servidor

-c Comunidad SNMP

-w Enlace wikipedia (Opcional)
ejemplo de uso: /usr/bin/addmonitoring.sh -p frontal -e prod -o linux -s srvorbita01 -i 172.20.0.14 -c redorbita -w https://red-orbita.com/
EOF

}
#Declaramos todas las variables que se van a usar para guardar los parametros

inputproject=

inputentorno=

inputso=

inputserver=

inputaddress=

inputcommunity=

inputwiki=
#Usamos el getopts para guardar los parametros en variables

while getopts «hH:p:e:o:s:i:w:» OPTION

do

case $OPTION in

h)

usage

exit 1

;;

p)

inputproject=$OPTARG

;;

e)

inputentorno=$OPTARG

;;

o)

inputso=$OPTARG

;;

s)

inputserver=$OPTARG

;;

i)

inputaddress=$OPTARG

;;

c)

inputcommunity=$OPTARG

;;

w)

inputwiki=$OPTARG

;;
esac

done
#Comprobamos que se han introducido los parametros obligatorios

if [ -z $inputproject ] || [ -z $inputentorno ] || [ -z $inputso ] || [ -z $inputserver ] || [ -z $inputaddress ] || [ -z $inputcommunity ]

then

usage

exit 1

fi
if [ ! -d «/usr/local/nagios/etc/projects/$inputproject» ]

then
echo -e «\e[0;31m ERROR: no se a encontrado el proyecto $inputproject ejecuta el comando /usr/bin/addproject.sh para crear el proyecto\e[0m»
exit 1
fi
if [ $inputentorno != prod -a $inputentorno != dev ]

then
echo -e «\e[0;31m ERROR: no se definio correctamente el entorno. debe ser prod o dev \e[0m»
exit 1

fi
if [ $inputso != linux -a $inputso != win ]

then
echo -e «\e[0;31m ERROR: no se definio el sistema operativo. debe ser linux o win \e[0m»
exit 1

fi
######################Funcion configuracion linux #################################################
function configlinux (){

if [ -f /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg ]

then
echo -e «\e[0;31m ERROR: se a detectado que el servidor /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg existe \e[0m»

exit
else
#Agregamos la configuracion del servidor
cp /usr/local/nagios/templates/templatesrvlinux.cfg /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg
sed -i -e «s|PROYECTO|$inputproject|g» /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

sed -i -e «s|ENTORNO|$inputentorno|g» /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

sed -i -e «s|URLWIKI|$inputwiki|g» /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

sed -i -e «s|SERVIDOR|$inputserver|g» /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

sed -i -e «s|DIRIP|$inputaddress|g» /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

sed -i -e «s|SNMPCOMMUNITY|$inputcommunity|g» /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg
fi

checksnmp=`snmpwalk -v2c -c $inputcommunity $inputaddress .1.3.6.1.4.1.2021.9 | wc -l`
if [ $checksnmp = 0 ]

then
echo -e «\e[0;31m ERROR: no se llega mediante snmp a $inputaddress. No se podra realizar toda la configuracion \e[0m»
else
for i in $( snmpwalk -v2c -c $inputcommunity $inputaddress .1.3.6.1.4.1.2021.9 | grep ‘STRING: «/’ | grep -v «mapper» | awk ‘{print $4}’ | sed ‘s/»/ /g’ ); do
echo «define service {» >> /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

echo «use $inputproject-serv-$inputentorno» >> /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

echo «host_name $inputserver» >> /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

echo «service_description FileSystem $i [No llamar a guardia]» >> /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

echo «check_command check_disk_snmp!techedge!$i!MB!80%!90%» >> /usr/local/nagios/etc/projects/$inputproject/linux/$inputserver.cfg

echo «}» >> /tmp/salida
done

fi
#Agregamos la configuracion en el fichero hosts.cfg
#Realizamos backup
cp /usr/local/nagios/etc/projects/$inputproject/hosts.cfg /usr/local/nagios/etc/projects/$inputproject/hosts.cfg-bck
cat << EOF >> /usr/local/nagios/etc/projects/$inputproject/hosts.cfg
define host {

use $inputproject-host-$inputentorno

host_name $inputserver

alias $inputserver

address $inputaddress

notes_url $inputwiki

}
EOF
configtemplate=`cat /usr/local/nagios/etc/projects/$inputproject/hosts.cfg | grep SERVIDOR | wc -l`
if [ $configtemplate = 0 ]

then
sed -i «6 s|$|,$inputserver|» /usr/local/nagios/etc/projects/$inputproject/hosts.cfg
else
sed -i -e «s|SERVIDOR|$inputserver|g» /usr/local/nagios/etc/projects/$inputproject/hosts.cfg
fi
if [ $inputentorno = prod ]

then
sed -i «4 s|$|,$inputserver|» /usr/local/nagios/etc/projects/grupos_linux_prod.cfg
fi
if [ $inputentorno = dev ]

then
sed -i «4 s|$|,$inputserver|» /usr/local/nagios/etc/projects/grupos_linux_dev.cfg
fi
}
if [ $inputso = linux ]

then
if [ -d /usr/local/nagios/etc/projects/$inputproject/linux ]

then
configlinux
else
#Creamos la carpeta
mkdir /usr/local/nagios/etc/projects/$inputproject/linux

configlinux
fi

fi
################################################################################################################################
######################Funcion configuracion windows #################################################
function configwindows (){

if [ -f /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg ]

then
echo -e «\e[0;31m ERROR: se a detectado que el servidor /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg existe \e[0m»

exit
else
#Agregamos la configuracion del servidor
cp /usr/local/nagios/templates/templatesrvwin.cfg /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg
sed -i -e «s|PROYECTO|$inputproject|g» /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg

sed -i -e «s|ENTORNO|$inputentorno|g» /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg

sed -i -e «s|URLWIKI|$inputwiki|g» /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg

sed -i -e «s|SERVIDOR|$inputserver|g» /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg

sed -i -e «s|DIRIP|$inputaddress|g» /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg

sed -i -e «s|SNMPCOMMUNITY|$inputcommunity|g» /usr/local/nagios/etc/projects/$inputproject/windows/$inputserver.cfg
fi
#Agregamos la configuracion en el fichero hosts.cfg
#Realizamos backup
cp /usr/local/nagios/etc/projects/$inputproject/hosts.cfg /usr/local/nagios/etc/projects/$inputproject/hosts.cfg-bck
cat << EOF >> /usr/local/nagios/etc/projects/$inputproject/hosts.cfg
define host {

use $inputproject-host-$inputentorno

host_name $inputserver

alias $inputserver

address $inputaddress

notes_url $inputwiki

}
EOF
configtemplate=`cat /usr/local/nagios/etc/projects/$inputproject/hosts.cfg | grep SERVIDOR | wc -l`
if [ $configtemplate = 0 ]

then
sed -i «6 s|$|,$inputserver|» /usr/local/nagios/etc/projects/$inputproject/hosts.cfg
else
sed -i -e «s|SERVIDOR|$inputserver|g» /usr/local/nagios/etc/projects/$inputproject/hosts.cfg
fi
if [ $inputentorno = prod ]

then
sed -i «4 s|$|,$inputserver|» /usr/local/nagios/etc/projects/grupos_win_prod.cfg
fi
if [ $inputentorno = dev ]

then
sed -i «4 s|$|,$inputserver|» /usr/local/nagios/etc/projects/grupos_win_dev.cfg
fi
}
if [ $inputso = win ]

then
if [ -d /usr/local/nagios/etc/projects/$inputproject/windows ]

then
configwindows
else
#Creamos la carpeta
mkdir /usr/local/nagios/etc/projects/$inputproject/windows

configwindows
fi

fi
################################################################################################################################
/etc/init.d/nagios configtest

Un saludo

:wq!

Comentarios