Monitorización en OpenBSD (I)

rrdtool
Como vamos a hablar de monitorización, podemos definirla como un sistema automático de tratamiento de información sensible a un administrador de sistemas en este caso (definición cutre se me antoja). En otras palabras normalmente se habla de monitorizar cuando queremos recoger información abundante de lo que pasa dentro del entorno monitorizado. Esa información se procesará de forma que se convierta en algo legible para el administrador (informes, gráficas, resúmenes...). Para nosotros el entorno monitorizado será una máquina corriendo OpenBSD y varios servicios de los cuales queremos procesar información. En esta primera entrega nos centraremos en pf, httpd, tráfico de red y estado de la máquina (cpu, mem...). Tenemos varias herramientas a nuestra disposición, desde RRDTool y MRTG hasta scripts particulares como rrdtool-helper de Juanjo. Siguiendo la filosofía de OpenBSD vemos que en la base del sistema no tenemos ninguna herramienta para tal efecto, con lo que buscamos en los packages encontrando varias alternativas. De todas ellas y para una monitorización básica como la que nos hemos marcado como objetivo, probablemente symon sea lo más sencillo de usar/instalar. Otro handicap importante es que su entorno web respeta totalmente el chroot del servidor, con lo que no le daremos más vueltas:
# pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/3.8/packages/i386/symon-2.71.tgz
symon-2.71: complete
...
--- symon-2.71 -------------------
An example configuration for symon has been installed in
/usr/local/share/examples/symon.

RRD files can be obtained by running
/usr/local/share/symon/c_smrrds.sh
#
La información final es importante, tenemos un ejemplo de configuración en el directorio indicado y también dice como podemos crear los archivos RRD que contendrán la información. El proceso viene a ser el siguiente:
  • Configuramos symon: Para ello nos servimos del ejemplo y editamos el mismo especificando las características propias del entorno:
    # cp /usr/local/share/examples/symon/symux.conf /etc/
    # cp /usr/local/share/examples/symon/symon.conf /etc/
    
    # nano /etc/symux.conf
    ...
    mux 127.0.0.1 2100
    
    source 127.0.0.1 {
            accept { cpu(0),  mem,
                     if(lo0),
                     pf,
    #                mbuf,
    #                sensor(0),
                     proc(httpd),
                     if(rl0), if(ne3), if(wi0),
    #                io(wd1), io(wd2), io(wd3), io(cd0)
                     io(wd0)
            }
    
            datadir "/usr/local/share/symon/rrds/localhost"
    }
    
    # nano /etc/symon.conf
    ...
    monitor { cpu(0),  mem,
              if(lo0),
              pf,
    #         mbuf,
    #         sensor(0),
             proc(httpd),
             if(rl0), if(ne3), if(wi0),
    #         io(wd1), io(wd2), io(wd3), io(cd0)
              io(wd0)
    } stream to 127.0.0.1 2100
    
    Hemos configurado tanto symux como symon, que serán los dos daemons encargados de recoger datos de todo lo indicado en la configuración, en este caso nos centramos en cpu(0), mem, pf, proc(httpd), tarjetas de red y disco duro io(wd0). También debemos configurar la variable datadir apuntando hacia el directorio donde estos dos procesos guardarán los datos en ficheros RRD (ojo con esto, porque más adelante cambiaremos el valor de datadir).
  • Creamos los ficheros RRD: Una vez configurados los daemons nos situamos en el directorio donde guardarán los datos (variable datadir) y creamos los RRD que hemos indicado en el archivo de configuración, para ellos symon viene con un script llamado c_smrrds.sh, lo copiamos en datadir y creamos los archivos de datos:
    # cp /usr/local/share/symon/c_smrrds.sh /usr/local/share/symon/rrds/localhost
    # cd /usr/local/share/symon/rrds/localhost
    # ./c_smrrds.sh cpu0 
    # ./c_smrrds.sh mem 
    # ./c_smrrds.sh pf 
    # ./c_smrrds.sh proc_httpd
    # ./c_smrrds.sh lo0
    # ./c_smrrds.sh rl0
    # ./c_smrrds.sh ne3
    # ./c_smrrds.sh wi0
    # ./c_smrrds.sh wd0
    # ls -l *rrd
    -rw-r--r--  1 root  wheel   4379260 Jan  5 12:10 cpu0.rrd
    -rw-r--r--  1 root  wheel   8757060 Jan  5 12:10 if_lo0.rrd
    -rw-r--r--  1 root  wheel   8757060 Jan  5 12:10 if_ne3.rrd
    -rw-r--r--  1 root  wheel   8757060 Jan  5 12:10 if_rl0.rrd
    -rw-r--r--  1 root  wheel   8757060 Jan  5 12:10 if_wi0.rrd
    -rw-r--r--  1 root  wheel   4379260 Jan  5 12:10 io_wd0.rrd
    -rw-r--r--  1 root  wheel   4379260 Jan  5 12:10 mem.rrd
    -rw-r--r--  1 root  wheel  19263780 Jan  5 12:10 pf.rrd
    -rw-r--r--  1 root  wheel   7005940 Jan  5 12:10 proc_httpd.rrd
    
    Ya hemos creado los archivos necesarios para que symon (y symux) guarden la información, teóricamente estamos preparados para arrancar los daemons y empezar la diversión.
  • Arrancando los daemons: Tenemos varias opciones, a las bravas o de una forma un tanto más ética, usando /etc/rc.local, que para eso está. Añadimos lo siguiente:
    # Symux
    if [ -x /usr/local/libexec/symux ]; then
            echo -n ' symux';       /usr/local/libexec/symux
    fi
    # Symon
    if [ -x /usr/local/libexec/symon ]; then
            echo -n ' symon';       /usr/local/libexec/symon
    fi
    
    Al reiniciar se inciarán los procesos, como todos los de /etc/rc.local, si queremos arrancarlos manualmente
    # /usr/local/libexec/symux
    # /usr/local/libexec/symon
    
    Y si todo ha sido correcto ahora tendremos los dos procesos corriendo y el puerto 2100 abierto en 127.0.0.1 (leyendo los archivos de configuración seguro que ya os habíais dado cuenta).
A tal momento tenemos un sistema de monitorización básico montado en nuestro entorno recogiendo información de lo que pasa en los ámbitos configurados, todo esto de una forma transparente e inapreciable para el usuario. Falta procesar esos datos y visualizarlos de una forma user friendly, para ello necesitamos algún interfaz web con estas características. Y digo interfaz web porque, configurado correctamente, podremos consultarlo remotamente desde cualquier sitio con acceso a ese httpd. Como no he encontrado ninguna solución ni en packages ni en ports vamos a tirar de código fuente pensado para OpenBSD y conservando el chroot del que tan orgullosos estamos. Después de buscar, he encontrado 2 opciones interesantes que se diferencian notablemente: phpsymon y syweb (este último sacado directamente de la web de symon):
  • Phpsymon: Procesa la información de forma instantánea conectándose al puerto 2100 y mostrando los resultados de forma gráfica y sencilla de interpretar, no utiliza ficheros RRD para nada.
  • Syweb: Utiliza los datos RRD para crear las típica gráficas rrdtool (dependencia) de forma que tendremos un histórico de toda la información procesada. Es obvio que debemos instalar rrdtool
Phpsymon es sencillo de instalar, solo tenemos que bajarlo y descomprimirlo en un directorio dentro de htdocs. La única configuración manejable se encuentra en el archivo defaults.php donde indicamos el host (127.0.0.2), el puerto al que conectar (2100) y poco más, es muy sencillo y, por defecto, no haría falta tocarle. Su salida es algo similar a ésto:

phpsymon


Syweb tiene más miga, además de bajarlo y descomprimirlo adecuadamente debemos preparar el chroot para que sea capaz de ejecutar rrdtool, darle un directorio temporal de caché, decirle donde se encuentran los archivos RRD de datos y poco más. Pero vamos por partes. Una vez dentro del directorio syweb ejecutamos un script que viene con él encargado de acondicionar el chroot para poder tener acceso a rrdtool y todas sus librerías:
# wget http://www.xs4all.nl/~wpd/symon/philes/syweb-0.53.tar.gz
# tar xfvvz syweb-0.53.tar.gz
# cd syweb/
# ls
CHANGELOG           Makefile            contrib             install_rrdtool.sh
INSTALL             README              htdocs              symon
# ./install_rrdtool.sh
rrdtool and libs installed in apache root
#
Nos fiamos de que haya hecho lo correcto (haced un ls de bin/ dentro del chroot, jeje). Ahora solo nos quedamos con el interfaz web (lo que se encuentra en syweb/htdocs/), lo ubicamos y vamos a configurar las opciones generales, para ello editamos setup.inc:
...
$symon['rrdtool_path']='/bin/rrdtool';
$symon['cache_dir']='cache';
$symon['host_tree']='rrds';
$symon['layout_dir']='/htdocs/tools/syweb';
...
Estas son las opciones más importantes. Para que funcione debemos tener los directorios cache/ y rrds/ creados (el primero de ellos con permisos de escritura para el usuario www) dentro de syweb/ Digamos que la estructura ha de ser la siguiente:
syweb/
   |  cache/
   |  rrd/
       |   localhost/*rrd
Y ahora surge un pequeño problema, los archivos RRD, como hemos visto anteriormente, dependen de la variable datadir que no se encuentra apuntando a este directorio. Ya advertí que llegados a este punto tendríamos que cambiar la ubicación de los RRD así que editamos de nuevo /etc/symux.conf:
	datadir "/var/www/htdocs/syweb/rrds/localhost"
Reiniciamos los servicios y, vía web, deberíamos ver algo similar a ésto:

syweb


Con todo esto tenemos lo más básico de la máquina monitorizado, si consigo reunir fuerzas y tiempo suficientes intentaré explicar otro tipo de monitorizaciones avanzadas (snmp, nagios...). Hasta entonces, suerte con las gráficas :).
sysadmin openbsd

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.