Actualizar Cacti a 0.8.7e y añadirle plugins


Cacti es un proyecto vivo, en el que contínuamente encontramos nuevas actualizaciones y plugins. Las actualizaciones nos permiten mantener actualizados los script que componen la distribución, pero si sustituimos nuestra versión por una versión superior, corremos el riesgo de perder los cambios que hayamos realizado en los scripts, y las plantillas que hubiéramos importado, por lo que es importante actualizar en vez de reinstalar.
Además podemos encontrar numerosos plugins, que añaden nuevas funcionalidades a nuestra consola. De entre todos encuentro muy útil el Agregate, que nos permite crear gráficas de agregados a partir de otras gráficas, y es bastante útil para comparar métricas de diferentes servidores, expresados en la misma magnitud. El plugin Monitor, no os lo recomiendo: yo me he encontrado con problemas al dar de alta nuevos dispositivos, teniendo habilitado este plugin.
En este post, os contaré como mantener actualizada nuestra versión de Cacti. Para ello, seguiremos la siguiente secuencia de pasos:

  1. Hacer un backup de la instalación que tenemos de nuestro cacti, para garantizar que podemos volver atrás.
    cd /var/www
    cp -R cacti cacti_backup_`date '+%Y%m%d'`
    También sería recomendable hacer un backup con mysqldump de la BBDD del servidor MySQL donde almacenamos los datos para Cacti.
  2. Descargar los plugins y las actualizaciones que queremos instalar, a un directorio local de nuestro servidor, supondremo que en el home
    cd
    mkdir update_cacti
    cd update_cacti

    wget http://www.cacti.net/downloads/cacti-0.8.7e.tar.gz

    export U="http://mirror.cactiusers.org/downloads/plugins"
    wget $U/cacti-plugin-0.8.7e-PA-v2.5.zip

    wget http://cactiusers.org/downloads/boost.tar.gz
    wget http://cactiusers.org/downloads/ntop.tar.gz
    wget http://cactiusers.org/downloads/settings.tar.gz
    wget http://cactiusers.org/downloads/thold.tar.gz
    wget http://cactiusers.org/downloads/tools.tar.gz
    wget http://cactiusers.org/downloads/update.tar.gz
  3. Preparar la actualización de nuestra distribución desde el directorio temporal que usamos para las descargas
    cd ~/update_cacti

    tar -xzvf cacti-0.8.7e.tar.gz
    mv cacti-0.8.7e/ cacti
    mkdir parche
    cd parche/

    unzip ../cacti-plugin-0.8.7e-PA-v2.5.zip
    cd ../cacti
    patch -p1 -N < ../parche/cacti-plugin-0.8.7e-PA-v2.5.diff

    cd plugins
    tar -xzvf ../../boost-2.4.tar.gz
    tar -xzvf ../../ntop-0.1.tar.gz
    tar -xzvf ../../settings-0.5.tar.gz
    tar -xzvf ../../thold-0.4.1.tar.gz
    tar -xzvf ../../tools-0.3.tar.gz
    tar -xzvf ../../update-0.4.tar.gz
  4. Instalar la version actualizada con plugins, sobrescribiendo nuestra instalación:
    cd ~/update_cacti/parche/cacti

    /bin/cp -Rf * /var/www/cacti/

    cp /var/www/cacti_backup_`date '+%Y%m%d'`/include/config.php \
    /var/www/cacti/include/config.php
    Ahora, editar el fichero /var/www/cacti/include/global.php, y añadir:
    $plugins = array(
    "boost",
    "ntop",
    "settings",
    "thold",
    "tools",
    "update"
    );

    $config['url_path'] = '/cacti/';
  5. Ahora, actualizar el modelo de la base de datos,
    cd ~/update_cacti/parche

    mysql -u cactiuser --password=SECRET -h SERVIDORBBDD \
    cacti < pa.sql
  6. Abrir el cacti en nuestro navegador como administrador, y seguir el asistente para completar la actualización. Cuando hayamos terminado, accederemos a User Management->Admin->Realm Permissions y marcaremos Plugin Management y el resto de plugins que queremos poder utilizar.

La foto la he sacado del album de cobalt123 en flickr

Ideas para optimizar MySQL

Cuando trabajamos con programas OpenSource es muy probable que terminemos usando MySQL 5.0, y cuando lo hacemos durante varios meses, también es muy probable que acabemos administrándolo, e intentando mejorar el redimiento. Para conseguirlo, os propongo tres posibles mejoras:

  1. La primera, es que usemos ext4 o xfs como sistema de archivos para /var/lib/mysql. Estos sistemas de archivos consiguen más velocidad y rendimiento que ext3.
  2. La segunda, consiste en usar un fichero por cada tabla innodb, para lo cual habrá que añadir la siguiente línea a la sección [mysqld] en /etc/mysql/my.cnf,
    innodb_file_per_table
    Esto evitará que el fichero /var/lib/mysql/ibdata1 crezca sin límite, alamcenando en él todos los datos de nuestra BBDD y siendo este fichero cuello de botella para el acceso a disco. Si este fichero se dañara perderíamos todas las bases de datos. Con esta optimización, lo que hacemos es que cada tabla MYSQL tenga su propio fichero bajo su correspondiente subdirectorio en /var/lib/mysql.Después de aplicar este cambio y reiniciar el servicio, tendremos que exportar e importar cada una de las base de datos que tuviéramos configuradas.
  3. La tercera consiste en aplicar algunas mejoras en la configuración, que encontramos en la comparativa http://developer.cybozu.co.jp/kazuho/2009/12/comparing-innod.html?lang=en, dentro de la sección tunning del fichero /etc/mysql/my.cnf:
    innodb_buffer_pool_size = 2048M
    innodb_log_file_size = 64M
    innodb_flush_method=O_DIRECT
    innodb_flush_log_at_trx_commit=2
    key_buffer_size=64M
    myisam_sort_buffer_size=32M

La foto la he sacado del album de Nanaki en flickr

El comando "bar"


Esta tarde, Antonio Rubio me ha mostrado la utilidad del comando bar, cuando estamos esperando a que termine un proceso largo como una copia vía scp o un simple dd: Es muy simple, basta con añadirlo a nuestro pipe..

cd /
tar cvpf - bin lib root sbin usr \
| bar \
| ssh root@192.168.1.2 "cd / && tar xvpf - "

Al hacerlo, veremos una pequeña barra de progreso, que al menos nos permitirá saber si la tarea sigue ejecutándose o no. Muy útil.
La foto la he sacado del album de Odalaigh en flickr

Debian Lenny DM-Multipath en IBM DS4700


Hoy he tenido la ocasión de configurar DeviceMapper Multipath en Debian Lenny para un cliente, que usaba almacenamiento de IBM, en concreto una DS4700. En el equipo, teníamos conectada una tarjeta Emulex y sólamente le hemos presentado una LUN de 100Gb para poder almacenar los ficheros de una base de datos MySQL 5.0.
Los pasos que he seguido para configurar multipath han sido los siguientes:

  1. Lo primero será instalar multipath:
    apt-get install multipath-tools
  2. Crear el fichero /etc/multipath.conf, inicial.
    defaults {
    user_friendly_names yes
    }

    devnode_blacklist {
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode "^hd[a-z][[0-9]*]"
    devnode "^cciss!c[0-9]d[0-9]*[p[0-9]*]"
    }

    devices {
    device {
    vendor "IBM*"
    product "1814*"
    getuid_callout "/lib/udev/scsi_id -g -u -s /block/%n"
    prio_callout "/sbin/mpath_prio_rdac /dev/%n"
    features "0"
    hardware_handler "1 rdac"
    path_grouping_policy group_by_prio
    failback immediate
    rr_weight uniform
    no_path_retry queue
    rr_min_io 1000
    path_checker rdac
    }
    }

    multipaths {
    multipath {
    wwid 3600a0b80001185dc0000306b4ae66c33
    alias sataext
    }
    }
  3. Refrescar la información sobre los caminos ...
    /etc/init.d/multipath-tools restart
    multipath -F
    multipath -v2
    ...y fijarnos en la salida, para localizar el ID de la LUN
    create: mpath2 (3600a0b80001185dc000033f64b26e485)  IBM     ,1814      FASt
    [size=100G][features=0][hwhandler=1 rdac]
    \_ round-robin 0 [prio=3][undef]
    \_ 1:0:0:0 sdb 8:16 [undef][ready]
    \_ round-robin 0 [prio=0][undef]
    \_ 1:0:1:0 sdc 8:32 [undef][ghost]
    libdevmapper: libdm-common.c(312): Created /dev/mapper/mpath
  4. Con el ID de la LUN, editaremos el fichero /etc/multipath.conf, y sustituiremos el wwid que teníamos en la sección multipaths. Recargar la información del almacenamiento:
    /etc/init.d/multipath-tools restart
    multipath -F
    multipath -v2
    multipath -ll
    ...y comprobar la salida...
    sataext (3600a0b80001185dc000033f64b26e485) dm-4 IBM     ,1814      FASt
    [size=100G][features=1 queue_if_no_path][hwhandler=1 rdac]
    \_ round-robin 0 [prio=3][active]
    \_ 1:0:0:0 sdb 8:16 [active][ready]
    \_ round-robin 0 [prio=0][enabled]
    \_ 1:0:1:0 sdc 8:32 [active][ghost]

Ahora ya podremos crear particiones en la LUN ejecutando fdisk /dev/sataext, crear volúmenes LVM, darles formato, etc...
La foto la he sacado del album de tophost en flickr

Recuperar la contraseña del root en mysql

Alguna vez me he encontrado con algún servidor de base de datos, del que no tenía la contraseña de root, y siempre termino buscando por internet. Aprovecho esta entrada para comentaros una forma de solucionarlo. El síntoma es que al ejecutar el comando mysql como root, nos encontramos con el siguiente error:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  1. Lo primero será parar el servicio de mysql
    /etc/init.d/mysqld stop
  2. Ahora arrancaremos el servicios, saltándonos la tabla de privilegios, mediante:
    /usr/bin/mysqld_safe --user=mysql --skip-grant-tables
  3. Ahora desde otra consola, nos conectaremos a mysql y podremos cambiar la clave del root.
    mysql> use mysql;
    mysql> update user set password=password('secreto') where user='root';
    mysql> exit;
  4. Reiniciar el servicio, y ya podremos conectar.
    /etc/init.d/mysqld restart 
La foto la he sacado del album de Travelling Pooh en flickr

Port-mirroring en switches 3COM


Port-mirroring es una configuración que podemos establecer en un switch, con el fin de que este envíe una copia de todos los paquetes que pasan por uno o más puertos (mirroring-port) a otro puerto concreto que llamamos monitor-port o, a otro switch. Esto es muy útil cuando necesitamos monitorizar el tráfico de red o detectar intrusiones en nuestra red. Dependiendo del fabricante podremos encontrarnos que,

  • En Cisco el port-mirroring se suele llamar como Switched Port Analyzer (SPAN)
  • Mientras en 3COM el port-mirroring se denomina Roving Analysis Port (RAP)
Antes de configurar nada, siempre deberíamos identificar los puertos del switch que queremos sniffar, mirroring-ports, (ejemplo: puertos del firewall, puertos donde están los servidores, etc... ) y el puerto al que queremos dirigir todo el tráfico y donde tendremos sniffer (monitor-port). Además sería recomendable identificar estos puertos o bocas del switch, en formato ID_EN_STACK/_FRONTAL_TRASERO/PUERTO. Una vez los tenemos identificados seguiremos la siguiente secuencia de pasos:
  1. Conectarse como admin al switch por telnet desde HyperTerminal de Windows
  2. Desactivar Spanning-Tree en la boca del switch que configuraremos como monitor-port (donde conectaremos el sniffer)
    sys
    interface GigabitEthernet 2/0/15
    stp disable
    q
    save
  3. Configurar el grupo de mirroring y el puerto que se encargará del sniffing:
    mirroring­group 1 local
    mirroring­group 1 monitor­port GigabitEthernet 2/0/15
  4. Agregar al grupo de mirroring los puertos que queremos monitorizar, los mirroring-ports (una linea por cada boca de la que queremos ver el tráfico):
    mirroring­group 1 mirroring­port GigabitEthernet 1/0/17 both 
  5. Guardar los cambios:
    q
    save
  6. Comprobar el resultado:
    display mirroring­group all
La foto la he sacado del album de philcampbell en flickr.

Hacer que nuestro Linux conozca las VLANes de nuestro switch


Hace unas semanas estuve en un cliente trabajando con switches y Port-Mirroring para monitorizar tráfico de red desde un servidor Linux. La teoría es sencilla: Configurar un monitor-port en nuestro switch y configurar las bocas del switch que queremos monitorizar como mirroring-port al grupo de mirror.
El problema nos aparece cuando tenemos varias VLANes en nuestro switch y la electrónica sólo nos permite un monitor-port activo al mismo tiempo. ¿Qué se puede hacer en este caso? ... podemos usar un equipo Linux, conectado al switch en la boca configurada como monitor-port y además, configurar este puerto como trunk-port, con STP deshabilitado, y propagar por él las VLANes que nos interese monitorizar.
Con esto, la electrónica enviará a la tarjeta de red de nuestro equipo todos los paquetes que lleguen a cualquiera de las bocas del switch configuradas como mirroring-port, sólo que si hacemos un tcpdump, probablemente sólo veamos el tráfico que se corresponde a la VLAN por defecto, o en su defecto la nº1. Para ver el tráfico de otras VLANes necesitaremos:

  1. Instalar el paquete VLAN (en Debian).
    apt­get install vlan
  2. Configurar las VLANes a las que queremos tener acceso...
    vconfig add eth1 1
    vconfig add eth1 5
    ...si ahora ejecutamos el comando ip a, comprobaremos como nos ha creado una nueva interfaz de red.
  3. Configurar una dirección IP editando el fichero /etc/networtk/interfaces y añadiendo las siguientes líneas:
    auto  vlan5
    iface vlan5 inet static
    address 192.168.4.101
    netmask 255.255.255.0
    vlan_raw_device eth1
Esto es una gran comodidad cuando no podemos tener todas las tarjetas de red que necesitamos en nuestro Linux, y tenemos que montar un router, o un firewall... una maravilla, sí señor.
La foto la he sacado del album de ivanx en flickr