Archive

You are currently browsing the Jose Antonio Cely Saidiza blog archives for noviembre, -0001.

Nov

30

INSTALACIÓN DE NAGIOS 2.7 EN DEBIAN ETCH, PARTE 1

By Jose Antonio Cely Saidiza

Este tutorial esta basado en la documentación oficial de nagios, y algunas tutoriales en español que hay en Internet, escribo este post, por que queria comentar mi experiencia con este espectacular programa que lo recomiendo un montón!
Nagios® es un software de monitorización de redes y sistemas, con licencia GPL. Nagios observa servidores y servicios de red específicos, alertándote cuando las cosas van mal y cuando están bien.
Para correr Nagios junto con sus plugins, solo es necesario tener un sistema operativo (de preferencia Linux :D ) con un servidor web, un compilador de C y la librería gd versión 1.6.3 o superior.

INSTALANDO NAGIOS

Este tutorial esta basado en debian etch que a la fecha es testing, intente instalarlo con apt-get install … pero la configuración por defecto no me funciono, tal vez por que el etch aun esta en testing, además me obligaba a usar el paquete exim4, y en el servidor de pruebas tengo qmail y esto me ocasionaría un conflicto. Entonces explicaré como instalar desde los fuentes.

De la página oficial de nagios:

http://www.nagios.org/download/

Descargamos la ultima versión ( a la fecha 2.7 ), en este caso nagios-2.7.tar.gz , y el paquete de plugins, en este caso la versión nagios-plugins-1.4.5.tar.gz (ya esta disponible la versión de plugins 1.4.6, pero me dio un error de compilación, entonces no la use)

Primero creamos los usuarios y grupos necesarios (www-data es el usuario en que corre apache en debian, en otras distribuciones puede variar)

adduser nagios
groupadd nagcmd
/usr/sbin/usermod -G nagcmd nagios
/usr/sbin/usermod -G nagcmd www-data

Creamos el directorio donde instalaremos nagios

mkdir /usr/local/nagios

Cambiamos de usuario y grupo el directorio recién creado

chown nagios:nagios -R /usr/local/nagios/

En el directorio donde este descargado nagios, lo descomprimimos

tar zxvf nagios-2.7.tar.gz

Luego ingresamos al directorio

cd nagios-2.7

Una vez en el directorio, ejecutamos

./configure – -prefix=/usr/local/nagios – -with-cgiurl=/nagios/cgi-bin – -with-htmurl=/nagios/ – -with-nagios-user=nagios – -with-nagios-group=nagios – -with-command-group=nagcmd

Si el configure no nos informa ningún error compilamos

make all

Instalamos…

make install

Creamos un script de inicialización en /etc/init.d/

make install-init

Ahora configuración del script creado para que se ejecute siempre al arranque (update-rc.d es el comando en debian para configurar servicios al arranque, en otras distribuciones puede variar)

update-rc.d nagios defaults

Configuramos permisos de algunos directorios

make install-commandmode

Instalamos algunas configuraciones de ejemplo, atención a este paso, por que nos basaremos en estos archivos para crear los nuestros

make install-config

Creamos enlaces simbólicos de binarios para nuestro sistema

ln -s /usr/local/nagios/bin/nagios /usr/sbin/nagios
ln -s /usr/local/nagios/bin/nagiostats /usr/sbin/nagiostats

Ahora instalaremos los plugins

Descomprimimos el paquete

tar zxvf nagios-plugins-1.4.5.tar.gz
cd nagios-plugins-1.4.5

Ejecutamos el script de configuración

./configure – -prefix=/usr/local/nagios – -with-cgiurl=/nagios/cgi-bin

Si el configure no nos informa ningún error compilamos

make

Instalamos…

make install
make install-root

Si hemos llegado a este punto sin problemas, crearemos la interfaz web de nagios

En el caso de ejemplo (debian etch) editaremos el archivo de configuración por default de apache2

/etc/apache2/sites-available/default

Al final agregamos

ScriptAlias /nagios/cgi-bin «/usr/local/nagios/sbin»


# SSLRequireSSL
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
# Order deny,allow
# Deny from all
# Allow from 127.0.0.1
AuthName «Nagios Access»
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user

Alias /nagios «/usr/local/nagios/share»


# SSLRequireSSL
Options None
AllowOverride None
Order allow,deny
Allow from all
# Order deny,allow
# Deny from all
# Allow from 127.0.0.1
AuthName «Nagios Access»
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user

Ahora creamos el archivo con el password para el usuario

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

Reiniciamos apache

/etc/init.d/apache2 restart

Ahora podremos comprobar si funciona apuntando con un navegador a nuestro servidor. Ejemplo

http://192.168.0.66/nagios

Debe aparecer en pantalla la típica ventana de autenticación de apache. Nos autenticamos y debemos ingresar a un panel de administración web, en hora buena!

CONFIGURANDO NAGIOS

Empieza lo interesante, vamos a configurar nagios!!!
En este caso crearé un entorno para mi empresa y algunos clientes como ejercicio. Monte el servidor nagios en un portátil abandonado, un PIII, con 128Mb de RAM, en el que ya tenia instalado apache2 con Debian etch, el portátil se conecta a Internet con el ADSL de mi apartamento, desde acá supervisaré los servidores de Tecsua los cuales son un firewall y dos servidores web y de correo. También supervisaré dos clientes específicos, uno consta de un router y un firewall, y el segundo cliente nada más supervisaremos un servidor de aplicaciones que solo esta encendido en horarios de oficina. Figura 1
Espero os sirva de base para sus configuraciones especificas.


Figura 1

Pero antes de eso veamos como se «ordena» esto en el sistema Nagios.
Deben crearse los «contactos», que son las personas a las que se les debe notificar cualquier cosa que este configurada en nagios. Estos contactos deben clasificarse en «grupos», que como su nombre lo indica, establece características en común para esos «contactos».

En mi ejemplo, tenemos tres contactos, los clasificados en dos grupos llamados admin y tehcnical, Figura 2
1 – nagiosadmin, es el administrador general, hace parte del grupo «admin»
2 – supervisor, un supuesto supervisor general, hace parte del grupo «admin»
3 – technical_1, un supuesto técnico de soporte, hace parte del grupo «technical»


Figura 2

Ahora debemos crear «hosts» (entiéndase por host a un servidor, un router, etc), y estos hosts también deben clasificarse en grupos con características en común

En mi ejemplo, tenemos 7 hosts clasificados en dos grupos llamados tecsuaservers y tecsuaclients, Figura 3
1 – tecsua_router, router de acceso a internet de las oficinas de tecsua, obviamente hace parte del grupo tecsuaservers
2 – firewall_tecsua, firewall general en las oficinas de tecsua, grupo tecsuaservers
3 – tecsua_server_1, servidor web y de en las correo oficinas de tecsua, grupo tecsuaservers
4 – tecsua_server_2, servidor web y de correo de un cliente en las oficinas de tecsua, grupo tecsuaservers
5 – c1_router, router de acceso a internet de un cliente especifico c1, grupo tecsuaclients
6 – firewall_c1, es el firewall general de el cliente especifico c1, grupo tecsuaclients
7 – appserver_c2, es el servidor de aplicaciones de un cliente especifico c2, el cual solo esta encendido en horarios de oficina, grupo tecsuaclients


Figura 3

Y por ultimo, debemos crear «servicios», que pueden ser de cualquier tipo (ping, smtp, http, etc), y estos servicios deben estar asociados a un host.
En mi ejemplo son 12 servicios,

    host & services

  • appserver_c2 HTTP, PING
  • c1_router PING
  • firewall_c1 PING
  • firewall_tecsua PING
  • tecsua_router PING
  • tecsua_server_1 HTTP, PING, SMTP
  • tecsua_server_2 HTTP, PING, SMTP

Una vez tenemos claro el escenario, (para esto recomiendo hacer un mapa como los anteriores) solo es codificar esto en los archivos de configuración.
Cuando ejecutamos en la instalación el comando make install-config, este nos creo unos archivos base en /usr/local/nagios/etc. El archivo de configuración principal es:
nagios.cfg, el cual trae toda una serie de configuraciones por defecto que aplican bien para la mayoría de los casos.
También nos creo el archivo localhost.cfg, el cual viene preconfigurado para supervisar el sistema local, es muy útil estudiar este archivo, trae ejemplos muy explicativos, pero en mi caso y como generalmente se hace, fraccioné este archivo el varios archivos sueltos, para que sea mas cómodo configurar las cosas. A continuación explico las pequeñas modificaciones a algunos archivos y muestro en pantalla los archivos creados sueltos, los cuales pueden crear con su editor favorito dentro de carpeta de configuración de nagios.

1 – En el archivo nagios.cfg

a – Buscar la linea que apunta al archivo de ejemplo localhost.cfg y comentarla para que no use ese archivo

# Host and service definitions for monitoring this machine
# cfg_file=/usr/local/nagios/etc/localhost.cfg

b – Descomentar las lineas que apuntan a varios archivos de configuración, estos son los que vamos a crear si no existen

cfg_file=/usr/local/nagios/etc/contactgroups.cfg
cfg_file=/usr/local/nagios/etc/contacts.cfg
#cfg_file=/usr/local/nagios/etc/dependencies.cfg
#cfg_file=/usr/local/nagios/etc/escalations.cfg
cfg_file=/usr/local/nagios/etc/hostgroups.cfg
cfg_file=/usr/local/nagios/etc/hosts.cfg
cfg_file=/usr/local/nagios/etc/services.cfg
cfg_file=/usr/local/nagios/etc/timeperiods.cfg

2 – En el archivo cgi.cfg

a – Buscar la linea use_authentication que esta establecida por defecto a 1, y configurarla a 0, sin autenticación, esto es NO recomendado, pero por ser la parte 1 del manual no nos complicaremos tanto, en la parte 2 hablaremos al detalle de la autenticación.

use_authentication=0

b – Al final del archivo des comentar las alarmas sonoras si las queremos usar, estar se ejecutarán en el cliente.

host_unreachable_sound=hostdown.wav
host_down_sound=hostdown.wav
service_critical_sound=critical.wav
service_warning_sound=warning.wav
service_unknown_sound=warning.wav
normal_sound=noproblem.wav

3 – Ahora creamos los archivos de configuración, aclaro nuevamente que este es para mi ejemplo, podéis ajustar estos archivos a tus necesidades. (cambiar xxx.xxx.xxx.xxx por sus direcciones IP)

A – contactgroups.cfg

define contactgroup{
contactgroup_name admin
alias Nagios Administrators
members nagiosadmin,supervisor
}

define contactgroup{
contactgroup_name technical
alias Network Technicals
members technical_1
}

B – contacts.cfg

define contact{
contact_name nagiosadmin
alias Nagios Administrator
service_notification_period 24×7
host_notification_period 24×7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email jose.cely@xxxxx.xxx
}

define contact{
contact_name supervisor
alias Network Supervisor
service_notification_period 24×7
host_notification_period 24×7
service_notification_options u,c,r
host_notification_options d,r
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email linus@xxxxx.xxx
}

define contact{
contact_name technical_1
alias Techical One
service_notification_period 24×7
host_notification_period 24×7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email alam.brito@xxxxx.xxx
}

C – hosts.cfg


# Generic host definition template – This is NOT a real host, just a template!

define host{
name generic-host ; The name of this host template
notifications_enabled 1 ; Host notifications are enabled
event_handler_enabled 1 ; Host event handler is enabled
flap_detection_enabled 1 ; Flap detection is enabled
failure_prediction_enabled 1 ; Failure prediction is enabled
process_perf_data 1 ; Process performance data
retain_status_information 1 ; Retain status information across program restarts
retain_nonstatus_information 1 ; Retain non-status information across program restarts
notification_period 24×7 ; Send host notifications at any time
register 0 ; DONT REGISTER THIS DEFINITION – ITS NOT A REAL HOST, JUST A TEMPLATE!
}

define host{
use generic-host ; Name of host template to use
host_name tecsua_router
alias Router SAGEM ADSL
address xxx.xxx.xxx.xxx
check_command check-host-alive
max_check_attempts 20
contact_groups admin
notification_interval 60
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name firewall_tecsua
alias Firewall Tecsua
address xxx.xxx.xxx.xxx
parents tecsua_router
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name tecsua_server_1
alias www.tecsua.com
address xxx.xxx.xxx.xxx
parents firewall_tecsua
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name tecsua_server_2
alias www.xxxxxx.com.co
address xxx.xxx.xxx.xxx
parents firewall_tecsua
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name c1_router
alias Router Coquito ADSL
address xxx.xxx.xxx.xxx
check_command check-host-alive
max_check_attempts 20
contact_groups admin
notification_interval 60
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name firewall_c1
alias Firewall xxxxxxxxx
address xxx.xxx.xxx.xxx
parents c1_router
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name appserver_c2
alias Aplication Server xxxxx
address xxx.xxx.xxx.xxx
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period workhours
notification_options d,u,r
}

D – hostgroups.cfg

define hostgroup{
hostgroup_name tecsuaservers
alias Tecsua Servers
members firewall_tecsua, tecsua_router, tecsua_server_1, tecsua_server_2
}

define hostgroup{
hostgroup_name tecsuaclients
alias Tecsua Clients
members c1_router, firewall_c1, appserver_c2
}

E – services.cfg


# Generic service definition template – This is NOT a real service, just a template!

define service{
name generic-service ; The ‘name’ of this service template
active_checks_enabled 1 ; Active service checks are enabled
passive_checks_enabled 1 ; Passive service checks are enabled/accepted
parallelize_check 1 ; Active service checks should be parallelized (disabling this can lead to major performance problems)
obsess_over_service 1 ; We should obsess over this service (if necessary)
check_freshness 0 ; Default is to NOT check service ‘freshness’
notifications_enabled 1 ; Service notifications are enabled
event_handler_enabled 1 ; Service event handler is enabled
flap_detection_enabled 1 ; Flap detection is enabled
failure_prediction_enabled 1 ; Failure prediction is enabled
process_perf_data 1 ; Process performance data
retain_status_information 1 ; Retain status information across program restarts
retain_nonstatus_information 1 ; Retain non-status information across program restarts
is_volatile 0 ; The service is not volatile
register 0 ; DONT REGISTER THIS DEFINITION – ITS NOT A REAL SERVICE, JUST A TEMPLATE!
}

define service{
# use generic-service ; Name of service template to use
host_name tecsua_router
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 240
notification_period 24×7
notification_options c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{
# use generic-service ; Name of service template to use
host_name c1_router
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical
notification_interval 240
notification_period 24×7
notification_options c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{
# use generic-service ; Name of service template to us
host_name tecsua_server_1
service_description HTTP
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_http
}

define service{
# use generic-service ; Name of service template to us
host_name tecsua_server_2
service_description HTTP
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_http
}

define service{
# use generic-service ; Name of service template to us
host_name appserver_c2
service_description HTTP
is_volatile 0
check_period workhours
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical
notification_interval 120
notification_period workhours
notification_options w,u,c,r
check_command check_http
}

define service{
# use generic-service ; Name of service template to us
host_name tecsua_server_1
service_description SMTP
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_smtp
}

define service{
# use generic-service ; Name of service template to us
host_name tecsua_server_2
service_description SMTP
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_smtp
}

define service{ # use generic-service ; Name of service template to us
host_name firewall_tecsua
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{ # use generic-service ; Name of service template to us
host_name firewall_c1
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{ # use generic-service ; Name of service template to us
host_name appserver_c2
service_description PING
is_volatile 0
check_period workhours
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical
notification_interval 120
notification_period workhours
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{ # use generic-service ; Name of service template to us
host_name tecsua_server_1
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period workhours
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{ # use generic-service ; Name of service template to us
host_name tecsua_server_2
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period workhours
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

F – timeperiods.cfg


# This defines a timeperiod where all times are valid for checks,
# notifications, etc. The classic «24×7» support nightmare. : – )

define timeperiod{
timeperiod_name 24×7
alias 24 Hours A Day, 7 Days A Week
sunday 00:00-24:00
monday 00:00-24:00
tuesday 00:00-24:00
wednesday 00:00-24:00
thursday 00:00-24:00
friday 00:00-24:00
saturday 00:00-24:00
}

# ‘workhours’ timeperiod definition
define timeperiod{
timeperiod_name workhours
alias «Normal» Working Hours
monday 09:00-18:00
tuesday 09:00-18:00
wednesday 09:00-18:00
thursday 09:00-18:00
friday 09:00-18:00
saturday 10:00-13:00
}

# ‘nonworkhours’ timeperiod definition
define timeperiod{
timeperiod_name nonworkhours
alias Non-Work Hours
sunday 00:00-24:00
monday 00:00-09:00,18:00-24:00
tuesday 00:00-09:00,18:00-24:00
wednesday 00:00-09:00,18:00-24:00
thursday 00:00-09:00,18:00-24:00
friday 00:00-09:00,18:00-24:00
saturday 00:00-10:00,13:00-24:00
}

# ‘none’ timeperiod definition
define timeperiod{
timeperiod_name none
alias No Time Is A Good Time
}

Con estos archivos base podremos inicializar nagios por primera vez, pero siempre después de cualquier configuración podemos correr una verificación de los archivos de configuración, antes de iniciar, para eso esta la bandera -v en el comando nagios, la cual verifica la sintaxis y correctas relaciones/asignaciones.

Corremos la verificación

nagios -v /usr/local/nagios/etc/nagios.cfg

Que en mi ejemplo al final me de dio esta salida:

Total Warnings: 0
Total Errors: 0

Things look okay – No serious problems were detected during the pre-flight check

Todo figura OK, en algunas configuraciones puede que nos muestre algún warning, pero estos no son tan trascendentales.
Ahora iniciaremos nagios por primera vez!.

/etc/init.d/nagios start

Podemos comprobar que el procesa esta en ejecución con

ps -A|grep nagios

Que en mi caso me muestra esta salida

4883 ? 00:00:00 nagios

En hora buena, ahora podemos acceder vía web a nagios, si la configuración de apache fue correcta deberíamos poder acceder vía web, en mi caso abro un navegador y apunto a mi servidor

http://192.168.0.66/nagios

Nos pedirá nombre de usuario y contraseña (los anteriormente creados), una vez logeados, podremos ver nuestros servidores y servicios, si es le primera vez que inicia nagios, debemos esperar unos minutos para que nagios ejecute sus comandos de supervisión configurados y de esta forma poder empezar a ver resultados en pantalla, Nagios tiene una interfaz web muy intuitiva que no explicaré en este articulo, ya es cuestión de vosotros profundizar. A continuación algunas capturas de pantalla:

Esto es todo por esta primera parte, si este tutorial tiene buena acogida escribiré la parte 2, explicando los mapas 2D y 3D, alarmas sonoras, integración con RRDTools, etc!

Links:

Nagios
http://nagios.org

How to no oficial en Español
http://nagios.linuxbaja.org