martes, 26 de marzo de 2013

Mysql Tuning para principiantes


Hoy vamos a ver un script de tuning para Mysql, ideal para administradores principiantes o que no dispongan de mucho tiempo para adentrarse en los parámetros de configuración de Mysql. Lo podemos descargar directamente de github en la siguiente web:


Al ejecutarlo nos pedirá un usuario con permisos globales y un password. Comprobará el estado del servidor indicándonos los parámetros a modificar, para obtener un rendimiento optimo. Tiene cuatro secciones principales:
  1. Estadísticas Generales; comprueba si es la última versión del script, si la versión de mysql está soportada, si el sistema operativo es de 64 bits. 
  2. Estadísticas del motor de almacenamiento. MySAM, InnoDB, etc. 
  3. Recomendaciones de seguridad. Comprueba usuarios locales, usuarios anónimos  password en blanco, usuarios remotos, etc. 
  4. Métricas de rendimiento. Aquí es donde usando las tablas de estadísticas y rendimiento del servidor nos va a mostrar el estado del motor. Desde cuando está funcionando, bytes enviados y recibidos. El tanto por ciento de aciertos de las diferentes caches/buffers, etc.

Primera Execución

Haremos una primera ejecución para ver el estado del servidor:

>> MySQLTuner 1.2.0 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.95
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------

[--] Status: -Archive +BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 3G (Tables: 20)
[--] Data in InnoDB tables: 5M (Tables: 209)
[!!] BDB is enabled but isn't being used
[!!] Total fragmented tables: 3

-------- Security Recommendations -------------------------------------------
[!!] User '@localhost' has no password set.
[!!] User '@server.mydomain.com' has no password set.
[!!] User 'root@127.0.0.1' has no password set.
[!!] User 'root@server.mydomain' has no password set.

-------- Performance Metrics -------------------------------------------------

[--] Up for: 13d 0h 39m 23s (4M q [3.579 qps], 499K conn, TX: 841M, RX: 7B)
[--] Reads / Writes: 55% / 45%
[--] Total buffers: 34.0M global + 2.7M per thread (100 max threads)
[OK] Maximum possible memory usage: 309.0M (7% of installed RAM)
[OK] Slow queries: 0% (40/4M)
[OK] Highest usage of available connections: 21% (21/100)
[!!] Key buffer size / total MyISAM indexes: 8.0M/4.9G
[!!] Key buffer hit rate: 92.0% (1B cached / 99M reads)
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 0% (49 temp sorts / 48K sorts)
[OK] Temporary tables created on disk: 10% (3K on disk / 30K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (64 open / 10K opened)
[OK] Open file limit used: 6% (70/1K)
[OK] Table locks acquired immediately: 99% (2M immediate / 2M locks)
[OK] InnoDB data size / buffer pool: 5.9M/8.0M

-------- Recommendations -----------------------------------------------------

General recommendations:
Add skip-bdb to MySQL configuration to disable BDB
Run OPTIMIZE TABLE to defragment tables for better performance
Enable the slow query log to troubleshoot bad queries
Set thread_cache_size to 4 as a starting value
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
key_buffer_size (> 4.9G)
query_cache_size (>= 8M)
thread_cache_size (start at 4)
table_cache (> 64)

Tuning

  • Lo primero que haremos es borrar los usuarios anónimos y poner passwords a los usuarios locales.
  • Añadiremos skip-bdb en el fichero /etc/my.cnf para des-habilitar el motor de bases de datos de Berkley, ya que no se usa.

# Using BerkeleyDB is now discouraged as its support will cease in 5.1.12.
skip-bdb

  • Recomienda realizar un  OPTIMIZE TABLE para desfragmentar tables para un mejor rendimiento. En este caso la tabla que esta más fragmentada es "data_bin" de la base de datos "centreon_storage". Es una tabla grande y que recoge datos de rendimiento de los servidores. Realizaremos su optimización de forma periódica.
  • Activaremos el "slow query log" para poder ver posibles consultas mal realizadas o lentas. Añadiremos en my.cnf:
log-slow-queries=/var/log/mysql/slow.log

Y crearemos los directorios y ficheros con los permisos correspondientes:
mkdir -p /var/log/mysql/
touch /var/log/mysql/slow.log
chmod 660 /var/log/mysql/slow.log
chown mysql:mysql /var/log/mysql/slow.log
  • Configuraremos la variable "thread_cache_size" a 4 como valor de inicio.
  • Incrementaremos de forma gradual los limites de caches y buffers:
key_buffer_size = 1024M
query_cache_size = 16M
thread_cache_size = 16M
table_cache = 128M
join_buffer_size = 8M

Reiniciamos Mysqld i volvemos a ejecutar el script para ver como se reflejan los cambios.

Estado final


>> MySQLTuner 1.2.0 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password:

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.95-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 3G (Tables: 20)
[--] Data in InnoDB tables: 5M (Tables: 209)
[!!] Total fragmented tables: 1

-------- Security Recommendations -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 3h 35m 32s (93K q [7.259 qps], 6K conn, TX: 68M, RX: 15M)
[--] Reads / Writes: 30% / 70%
[--] Total buffers: 1.0G global + 10.6M per thread (100 max threads)
[OK] Maximum possible memory usage: 2.1G (53% of installed RAM)
[OK] Slow queries: 0% (0/93K)
[OK] Highest usage of available connections: 21% (21/100)
[OK] Key buffer size / total MyISAM indexes: 1.0G/4.8G
[OK] Key buffer hit rate: 100.0% (7M cached / 591 reads)
[OK] Query cache efficiency: 86.1% (30K cached / 35K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 515 sorts)
[OK] Temporary tables created on disk: 1% (29 on disk / 2K total)
[OK] Thread cache hit rate: 99% (21 created / 6K connections)
[OK] Table cache hit rate: 81% (255 open / 313 opened)
[OK] Open file limit used: 0% (76/65K)
[OK] Table locks acquired immediately: 100% (18K immediate / 18K locks)
[OK] InnoDB data size / buffer pool: 5.9M/8.0M

-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance

Se puede observar de forma global que los resultados han mejorado de forma considerable. Las tablas de rendimiento se vacían cada vez que se reinicia mysql, por eso es bueno ejecutar el script de tuning pasado una semana, de está forma las estadísticas de rendimiento y uso nos darán unos valores más reales. 


viernes, 22 de marzo de 2013

Cambio de IP de las System Controller E4900


Hoy vamos a ver como cambiar las IP de las dos System Controller de un Sun Fire E4900. Deberemos modificar la IP de forma remota, reiniciar y posteriormente cambiar la VLAN. El motivo es el de aislar la red de consolas de la red de servicio. Esperamos que con esto se solucione un problema que tienen las system controller, al parecer y según Oracle de forma extraoficial; "Se han encontrado que las consolas en redes con mucho tráfico acaban dejando de responder por ssh". Al parecer es nuestro caso. Actualmente la System Controller Slave no repsonde y de forma periódica debemos de reiniciarlas. 

Pasos a seguir

  1. Reboot de la Slave System Controller
  2. Conectar a la Slave System Controller
  3. Cambiar la IP y red de la Slave System Controller
  4. Cambiar la VLAN de la Slave System Controller
  5. Hacer un cambio de Slave to Main.
  6. Conectar a la Main System Controller
  7. Cambiar la IP y red de la Main System Controller
  8. Cambiar la VLAN de la Main System Controller
  9. Hacer un cambio de Slave to Main.

Cambiar IP de la Slave System Controller

server_sc0:sc> showplatform
The system controller is configured to be on a network.
Network settings: static
Hostname: server_sc0
IP Address: 192.168.0.3
Netmask: 255.255.255.0
Gateway: 192.168.0.1
DNS Domain:
Primary DNS Server:
Secondary DNS Server:
Connection type: ssh
Idle connection timeout : No timeout
SNTP server:
SC POST diag Level: min
SC Failover: enabled but not active.
Persistent log option is not available in user mode.

server_sc0:sc> setupplatform -p network
Network Configuration
---------------------
Is the system controller on a network? [yes]:
Use DHCP or static network settings? [static]:
Hostname [hostname]: server_sc0
IP Address [xx.x.xx.xx]: 10.11.10.3
Netmask [xxx.xxx.xxx.x]: 255.255.0.0
Gateway [xx.x.xx.x]: 10.11.10.101
DNS Domain [xxxx.xxx.xxx]: blank
Primary DNS Server [xxx.xxx.xxx.xx]: blank
Secondary DNS Server [xxx.xxx.xx.x]: blank
To enable remote access to the system controller, select "ssh" or
"telnet."
Connection type (ssh, telnet, none) [none]: ssh
Rebooting the SC is required for changes in the above network
settings to take effect.
Idle connection timeout (in minutes; 0 means no timeout) [0]: 10

server_sc0:sc>reboot

Esperar 5 minutos.

Cambiar la VLAN.

Hacer ping a la nueva IP y conectarse.
server_sc0:sc>showfailover -v
server_sc0:sc>setfailover on
server_sc0:sc>showfailover -v

Hacer un failover de forma manual.
server_sc0:sc>setfailover force
server_sc0:sc>showfailover -v

Comprobar que sc0 es la SC Main.

Cambiar la IP de la Main System Console

server_sc1:SC> showplatform
Domain Solaris Nodename Domain Status Keyswitch
-------- ------------------ ----------------------- -------------
A server Active - Solaris on
B - Powered Off standby
C - Powered Off off
D - Powered Off off

Only domain A is enabled in partition0.
The system controller is configured to be on a network.
Network settings: static
Hostname: server_sc1
IP Address: 192.168.0.4
Netmask: 255.255.255.0
Gateway: 192.168.0.1
DNS Domain:
Primary DNS Server:
Secondary DNS Server:
Connection type: ssh
Idle connection timeout : No timeout
Loghost for Platform:
Log Facility for Platform: local0
SNTP server:
SNMP Agent: enabled
Chassis Description: Sun Fire E4900
Chassis Contact:
Chassis Location:
Trap Hosts:
Public Community String: public
Private Community String: public
ACL for Domain A: SB0 SB2 SB4 IB6 IB8
ACL for Domain B: SB0 SB2 SB4 IB6 IB8
ACL for Domain C: SB0 SB2 SB4 IB6 IB8
ACL for Domain D: SB0 SB2 SB4 IB6 IB8
Chassis HostID: ABCEFG
PROC RTUs installed: 1
PROC Headroom Quantity: 4
PROC RTUs reserved for domain A: 5
PROC RTUs reserved for domain B: 0
PROC RTUs reserved for domain C: 0
PROC RTUs reserved for domain D: 0
SC POST diag Level: min
SC Failover: disabled
Logical Hostname:

Chassis is in single partition mode.
UltraSPARC IV+ is supported in partition 0

Frame: 0003ba:6bea48 (Tue Jan 15 14:11:28 CET 2013)
Fail LED:Off Service LED:Off
Frame Fan Trays
Left Tray Right Tray
State: OK OK
Power LED: On On
Fault LED: Off Off
Service LED: Off Off
Speed: Slow Slow
Temperature: Normal Normal
Power: OK OK
Fan 0: OK OK
Fan 1: OK OK
Fan 2: OK OK
Frame RTS
Rear/Left - OK, Connected to the System
Rear/Right - OK
Front/Left - Not Present
Front/Right - Not Present

Persistent log option is not available in user mode.


server_sc1:SC> setupplatform -p network
Network Configuration
---------------------
Is the system controller on a network? [yes]:
Use DHCP or static network settings? [static]:
Hostname [hostname]: server_sc1
IP Address [xx.x.xx.xx]: 10.11.10.4
Netmask [xxx.xxx.xxx.x]: 255.255.0.0
Gateway [xx.x.xx.x]: 10.11.10.101
DNS Domain [xxxx.xxx.xxx]: blank
Primary DNS Server [xxx.xxx.xxx.xx]: blank
Secondary DNS Server [xxx.xxx.xx.x]: blank
To enable remote access to the system controller, select "ssh" or
"telnet."
Connection type (ssh, telnet, none) [none]: ssh
Rebooting the SC is required for changes in the above network
settings to take effect.
Idle connection timeout (in minutes; 0 means no timeout) [0]: 10

server_sc1:SC>reboot

Cambiar la VLAN.

Esperar 5 minutos.

Hacer ping y volver a conectar.
server_sc0:sc>showfailover -v
server_sc0:sc>setfailover on
server_sc0:sc>showfailover -v

Cambiar el /etc/hosts del servidor.

Saludos!!


jueves, 21 de marzo de 2013

Monitorización de VMWARE con Centreon/Nagios

Buenos días,

 hoy vamos a ver como monitorizar nuestro servidores de vmware desde Centreon o Nagios. El mejor sitio para empezar a buscar scripts i recursos de monitorización de Nagios es "Nagios Exchange". Tanto usando la búsqueda como navegando por sus categorías nos podemos encontrar una gran cantidad de scripts para casi todos nuestros dispositivos, servidores o servicios.

Recordar que cualquier script de Nagios es plenamente compatible con Centreon.

De Vmware hay unos cuantos con buenas referencias. Yo personalmente he usado el siguiente ya que me parece maduro y con ciertas garantías. Ha sido desarrollado por el equipo "OP5". Se encargan de realizan un producto de monitorización profesional propio y dan cierta sensación de seguridad.

Una vez descargado el script, al leer el README podemos ver que hay que hacer unos preparativos previos antes de su instalación. El pilar básico de funcionamiento es el "vSphere SDK for Perl", es un software de desarrollo en PERL hecho por vmware para poder consultar las API de sus productos. Para poder descargarlo tenemos que tener un usuario y password en www.vmware.com, el registro es gratuito.

El link directo de descarga es el siguiente:

Descargaremos la versión 5.1
VMware-vSphere-Perl-SDK-5.1.0-780721.x86_64.tar.gz

Un punto fuerte de la instalación es que está todo bien documentado por parte de vmware. La documentación la podéis encontrar aquí.

Nuestro servidor de Centreon corre con RHEL 5.9, así que los requisitos de instalación son los siguientes:


Después hay una serie de módulos que la propia instalación descarga de los repositorios oficiales de redhat o los descarga de Perl mediante CPAN. El tema de los requerimientos de perl a veces es un poco tedioso, ya que hay paquetes en el repositorio y  otros que solo se encuentran por CPAN. Algunas veces nos podemos encontrar que se han de mezclar ambos para que nuestro software funcione. 
Mi recomendación es instalarlos o desde el repositorio de redhat o desde el Perl CPAN perno no mezclar ya que podría darnos problemas en el fututo. En este caso no hay otra opción que ir complementando ambas fuentes de paquetes.

Paquetes/módulos de Perl requeridos:

Crypt-SSLeay-0.55 (0.55-0.9.7 or 0.55-0.9.8)   
IO-Compress-Base-2.037   
Compress-Zlib-2.037   
IO-Compress-Zlib-2.037
Compress-Raw-Zlib-2.037   
Archive-Zip-1.28   
Data-Dumper-2.121   
XML-LibXML-1.63   
libwww-perl-5.805   
LWP-Protocol-https-6.02   
XML-LibXML-Common-0.13   
XML-NamespaceSupport-1.09   
XML-SAX-0.16   
Data-Dump-1.15   
URI-1.37
UUID-0.03
SOAP-Lite-0.710.08
HTML-Parser-3.60
version-0.78
Class-MethodMaker-2.10
Una vez se ha conseguido cumplir con los requerimientos, realizaremos la instalación de SDK:

# tar -xvf VMware-vSphere-Perl-SDK-5.1.0-780721.x86_64.tar.gz
# cd vmware-vsphere-cli-distrib/
#./vmware-install.pl

Aceptaremos la EULA (End User Licencese Agreement) y dejaremos que instalé paquetes y dependencias. Al acabar habrá dejado el modulo de perl en su directorio correspondiente.

Para ver que realmente el modulo de perl exista lo podemos hacer con el siguiente comando:

# perl -MFile::Find=find -MFile::Spec::Functions -Tlw -e 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC' |grep VMware
/usr/lib/perl5/5.8.8/VMware/VIM2Stub.pm
/usr/lib/perl5/5.8.8/VMware/VILib.pm
/usr/lib/perl5/5.8.8/VMware/VICredStore.pm
.
.
.
.

Solo nos queda copiar el script de Nagios Exchange en nuestro directorio de plugins de Nagios y probarlo:

#cp check_vmware_api.pl /usr/lib64/nagios/plugins
# cd /usr/lib64/nagios/plugins
#./check_vmware_api.pl
Usage: check_vmware_api.pl -D <data_center> | -H <host_name> [ -C <cluster_name> ] [ -N <vm_name> ]
    -u <user> -p <pass> | -f <authfile>
    -l <command> [ -s <subcommand> ] [ -T <timeshift> ] [ -i <interval> ]
    [ -x <black_list> ] [ -o <additional_options> ]
    [ -t <timeout> ] [ -w <warn_range> ] [ -c <crit_range> ]
    [ -V ] [ -h ]

Missing argument: command

Vamos a probar de lanzar alguna consulta a nuestro servidor de VCENTER para ver si todo funciona.
#./check_vmware_api.pl -D vcenter -C MY_CLUSTER -u myuser -p mypassword -l runtime list
CHECK_VMWARE_API.PL CRITICAL - Server version unavailable at 'https://vcenter:443/sdk/vimService.wsdl' at /usr/lib/perl5/5.8.8/VMware/VICommon.pm line 545

Si nos aparece esté error pueden ser dos cosas. Las consultas se realizan con SOAP, XML y HTTPS. Recordar desactivar la variable de "https_proxy" del sistemas, ya que la consulta es en nuestra red y no queremos que pase por el proxy.

#unset https_proxy

Y por otra banda añadir al script de Nagios Exchange la siguiente línea, justo después del la línea del interprete perl:

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

Evitará verificar el certificado SSL.

Lo volvemos a probar:
#./check_vmware_api.pl -D vcenter -C MY_CLUSTER -u myuser -p mypassword -l runtime list
CHECK_VMWARE_API.PL OK - 450/499 VMs up, overall status=green, no config issues | vmcount=450units;;
Funciona perfectamente. Para más delante miraremos de añadir los chequeos en Nagios/Centreon de los host/hipervisores, cluster, virtual center y máquinas virtuales.


Saludos!!



martes, 19 de marzo de 2013

Buscando ficheros grandes en Linux

Hola a todos,

 una de las alarmas más comunes en los servidores es la de falta de espacio en disco. Normalmente suele ser un log de alguna aplicación que se ha descontrolado, generalmente se puede solventar de foma rapida truncando el fichero y dejando que se vuelva a generar. Eso si, guardando los ultimos 7 dias de log.

Para ampliar el chuletario, yo siempre utilizo esté comando situandome en el filesystem en cuestión.

find . -xdev -size +1024M -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'

Un find que busca en "." el FS actual, para ello se usa el comando "-xdev" que limita la busqueda al filesystem actual, +1024M son ficheros de más de este tamaño. Posteriormente ejecuta un listado con los comandos a gusto del consumidor, para finalmente quedarnos con las columnas 5 i 9 que son el nombre del fichero i el tamaño. El resultado sería algo tal que así:

ricard@mycomputer:~$ find . -xdev -size +1024M -exec ls -lh {} \; | awk '{ print $5 ": " $9 }' |sort
2.9G: ./Downloads/backup-lamp-prd/backup.sql.tar
2.9G: ./isos/rhel-server-6.2-i386-dvd.iso
2.9G: ./isos/rhel-server-6.3-i386-dvd.iso
3.0G: ./isos/rhel-server-5.6-i386-dvd.iso
3.1G: ./isos/BT5R3-GNOME-64.iso
3.3G: ./isos/rhel-server-5.8-i386-dvd.iso
3.4G: ./isos/rhel-server-6.2-x86_64-dvd.iso
3.5G: ./isos/rhel-server-6.3-x86_64-dvd.iso
3.9G: ./isos/rhel-server-5.8-x86_64-dvd.iso
7.4G: ./Downloads/backup.sql
Si añadimos al final un sort, nos quedará ordenado de menor a mayor.

Espero que os sea de utilidad.

Saludos.

lunes, 18 de marzo de 2013

RHEL: Agregar servidor a RHN

Hola a todos,

 hoy vamos a ver como agregar un servidor Red Hat Enterprise Linux (RHEL) a la Red Hat Network (RHN), desde está red de Red Hat podremos instalar/des-instalar/actualizar los paquetes de los servidores. Es el principal paso a realizar una vez instalado el servidor. Para ello se necesita que el servidor disponga de una licencia válida activa en la RHN. 

Todas las acciones la realizaremos usando el comando "yum".

Si es necesario un proxy para su salida a Internet se recomienda configurar las variables de entorno en el fichero /etc/profile:

ftp_proxy=http://yourproxy.yourdomain.com:80 http_proxy=http://yourproxy.yourdomain.com:80 https_proxy=http://yourproxy.yourdomain.com:80

El fichero /etc/profile cargará las variables a todos los usuarios que hagan login en el sistema.

Registraremos el servidor. Cambiar el parámetro "proxy" por vuestro proxy de salida a Internet:

# rhn_register --proxy=http://yourproxy.yourdomain.com:80



En la siguiente pantalla seleccionaremos "Next".







Pondremos nuestro usuario y password de Red Hat Network y "Next".







Nos indicará el nombre del perfil del servidor y si queremos enviar la información de hardware y red. 

Seleccionaremos "Next".







Enviaremos el catalogo de paquetes instalados. Seleccionamos "Next".







Enviamos la información a la RHN. Seleccionamos "Next".










Finalmente "OK".







Y "Finish".






Si no disponemos de licencias o si no hay canales disponibles saldrá un mensaje de advertencia indicándolo.



El servidor ya está registrado, lo podemos probar haciendo un búsqueda de un paquete:


#yum search
nmap Loaded plugins: downloadonly, rhnplugin, security ============================================ Matched: nmap =============================================
nmap.i386 : Network exploration tool and security scanner nmap-frontend.i386 : Gtk+ frontend for nmap

De momento esto es todo, más adelante instalaremos paquetes y actualizaremos el sistema.
Saludos!!


miércoles, 13 de marzo de 2013

Instalación y configuración de logwatch

Logwatch es una herramienta que de forma diaria envia un correo resumen, de los cambios que se han realizado en los servidores. Se recorre los logs más comunes messages, last, df -h, espacio, etc.

Para su instalación:
# yum install logwatch
Una vez instalado hay que configurar  el servidor de correo. En nuestro caso usaremos postfix. Lo primero en /etc/aliases cambiaremos root por nuestra dirección de correo a enviar correos:

# vi /etc/aliases

# Person who should get root's mail
root: root@mydomain.com

En el fichero de configuración de postfix /etc/postfix/main.cf añadiremos los siguientes campos:

myhostname = myhostname.mydomain.com
mydomain = mydomain.com
mynetworks_style = subnet
relayhost = 192.168.1.3

Reiniciamos postfix:

#service postfix restart

Ejecutamos logwatch.

#logwatch

Podemos ver como sale el correo en /var/log/maillog

#tail -f /var/log/maillog
Mar 12 10:11:11 myserver postfix/smtp[20048]: 7E2361E4: to=<root@mydomain.com>, orig_to=<root>, relay=192.168.1.3[192.168.1.3]:25, delay=0.14, delays=0/0.07/0/0.06, dsn=2.6.0, status=sent (250 2.6.0  <20130312091111.7AE81177@mydomain.com> Queued mail for delivery)
Mar 12 10:11:11 myserver postfix/qmgr[19702]: 7E2361E4: removed
Lo que recibiremos en el correo es lo siguiente:

 ################### Logwatch 7.4.0 (03/01/11) ####################
        Processing Initiated: Tue Mar 12 10:39:18 2013
        Date Range Processed: yesterday
                              ( 2013-Mar-11 )
                              Period is day.
        Detail Level of Output: 0
        Type of Output/Format: stdout / text
        Logfiles for Host: myhost.mydomain.com
 ##################################################################

 --------------------- dpkg status changes Begin ------------------------
 Upgraded:
    firefox 19.0+build1-0ubuntu0.12.04.2 => 19.0.2+build1-0ubuntu0.12.04.1
    firefox-globalmenu 19.0+build1-0ubuntu0.12.04.2 => 19.0.2+build1-0ubuntu0.12.04.1
    firefox-gnome-support 19.0+build1-0ubuntu0.12.04.2 => 19.0.2+build1-0ubuntu0.12.04.1
    firefox-locale-en 19.0+build1-0ubuntu0.12.04.2 => 19.0.2+build1-0ubuntu0.12.04.1

 ---------------------- dpkg status changes End -------------------------

 --------------------- httpd Begin ------------------------

 Requests with error response codes
    404 Not Found
       /rhel63/repodata/repomd.xml: 7 Time(s)

 ---------------------- httpd End -------------------------

 --------------------- Kernel Begin ------------------------

 WARNING:  Kernel Errors Present
    ACPI Error: Method parse/ex ...:  3 Time(s)
    ACPI Error: [CAPD] Namespac ...:  3 Time(s)
    ACPI: Marking method _OSC as Serialized because of AE_ALREADY_EXISTS error ...:  1 Time(s)
    EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro ...:  1 Time(s)
    EXT4-fs (sda3): mounted filesystem with ordered data mode. Opts: errors=remount-ro ...:  1 Time(s)

 ---------------------- Kernel End -------------------------

 --------------------- pam_unix Begin ------------------------
 lightdm:
    Unknown Entries:
       session closed for user lightdm: 1 Time(s)
       session opened for user lightdm by (uid=0): 1 Time(s)
       session opened for user ricard by (uid=0): 1 Time(s)

 sudo:
    Sessions Opened:
       ricard -> root: 2 Time(s)


 ---------------------- pam_unix End -------------------------

 --------------------- Connections (secure-log) Begin ------------------------

 **Unmatched Entries**
    dbus: [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.27" (uid=104 pid=1933 comm="/usr/lib/indicator-datetime/indicator-datetime-ser") interface="org.freedesktop.DBus.Properties" member="GetAll" error name="(unset)" requested_reply="0" destination=":1.18" (uid=0 pid=1665 comm="/usr/sbin/console-kit-daemon --no-daemon "): 1 Time(s)
    dbus: [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.35" (uid=104 pid=1977 comm="/usr/lib/indicator-datetime/indicator-datetime-ser") interface="org.freedesktop.DBus.Properties" member="GetAll" error name="(unset)" requested_reply="0" destination=":1.18" (uid=0 pid=1665 comm="/usr/sbin/console-kit-daemon --no-daemon "): 1 Time(s)
    dbus: [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.59" (uid=1000 pid=2261 comm="/usr/lib/indicator-datetime/indicator-datetime-ser") interface="org.freedesktop.DBus.Properties" member="GetAll" error name="(unset)" requested_reply="0" destination=":1.18" (uid=0 pid=1665 comm="/usr/sbin/console-kit-daemon --no-daemon "): 1 Time(s)
    gnome-keyring-daemon: couldn't allocate secure memory to keep passwords and or keys from being written to the disk: 1 Time(s)
    gnome-keyring-daemon: unsupported key algorithm in certificate: 1.2.840.10045.2.1: 1 Time(s)
    gnome-screensaver-dialog: gkr-pam: unlocked login keyring: 10 Time(s)
    lightdm: pam_ck_connector(lightdm:session): nox11 mode, ignoring PAM_TTY :0: 2 Time(s)
    lightdm: pam_succeed_if(lightdm:auth): requirement "user ingroup nopasswdlogin" not met by user "ricard": 1 Time(s)
    polkitd(authority=local): Registered Authentication Agent for unix-session:/org/freedesktop/ConsoleKit/Session2 (system bus name :1.47 [/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1], object path /org/gnome/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8): 1 Time(s)
    polkitd(authority=local): Unregistered Authentication Agent for unix-session:/org/freedesktop/ConsoleKit/Session2 (system bus name :1.47, object path /org/gnome/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus): 1 Time(s)

 ---------------------- Connections (secure-log) End -------------------------

 --------------------- Sudo (secure-log) Begin ------------------------

 ricard => root
 --------------
 /bin/bash                      -   2 Time(s).

 ---------------------- Sudo (secure-log) End -------------------------

 --------------------- Disk Space Begin ------------------------
 Filesystem      Size  Used Avail Use% Mounted on
 /dev/sda1        20G  5.4G   13G  30% /
 udev            1.5G  4.0K  1.5G   1% /dev
 /dev/sda3       124G  107G   11G  92% /home

 /dev/sda3 => 92% Used. Warning. Disk Filling up.

 ---------------------- Disk Space End -------------------------

 ###################### Logwatch End ######################### 

Una herramienta útil para recibir en nuestro correo el estado de los servidores a modo de resumen. El uso de logwatch no evita el tener que tener alguna otra herramienta como Nagios o Centreon que nos permita ver el estado de los servidores en tiempo real.

Hasta la próxima.


lunes, 11 de marzo de 2013

SNMPTraps y Centreon 2.4


Hola,

 durante estos días me he tenido que enfrentar con un problema que ha surgido al chequear el NAS de EMC (antiguo celerra).  La monitorización se realiza con el sistema de monitorización Centreon que a su vez en sus capas más bajas utiliza Nagios.  Dejo para proximos post el funcionamiento cliente-servidor del protocolo SNMP y la monitorización por NRPE de Centreon. En este caso nos centraremos en como Centreon 2.4 recibe alertas de forma pasiva desde dispositivos que tenga habilitado SNMPTrap. 

La idea básica es que uno de nuestros sistemas al tener algún cambio de estado o mal funcionamiento envíe un mensaje por SNMP a nuestro servidor de monitorización. Esté último nos avisará mediante alertas y correo. Se realizá por SNMPTrap y no por NRPE para evitar instalar agentes y software no soportado por el fabricante, en este caso por EMC.

Como trata Centreon los SNMP Traps

En la versión 2.4 de Centreon el circuito de un mensaje o Trap es el siguiente; el servidor de Centreon tiene configurado el demonio de snmpd, escuchando mensajes snmp en la red destinados a él. Hay otro demonio que es ejecutado junto con él llamado snmptrapd que recibe el trap, y lo envía a un traductor snmptt que comprueba si hay una MIB. Si la hay genera un comando de Centreon (centTrapHandler) para insertarlo como mensaje en Nagios. Posteriormente envía una alerta y correo. Un poco complicado ¿verdad?

SNMPD --> SNMPTRAPD --> SNMPTT --> CENTTRAPHANDLER --> CENTREON

Bien, nuestro servidor está configurado de está forma y recibe las alertas por snmptrap sin problemas, excepto las que envía el NAS.  

Configuración de SNMP Traps para EMC

El primer paso que hay que realizar es buscar el fichero de MIB de nuestro dispositivo en la web del fabricante. El nuestro es el siguiente:



--------------------------------------------------------------------------
-- Copyright (c) 1998-2002, All rights reserved by
--
-- EMC Corporation
-- 171 South Street
-- Hopkinton, MA 01748 USA
--
-- This software is furnished under a license and may be used and copied
-- inclusion of the above copyright notice. This software or  any  other
-- only  in  accordance  with  the  terms  of such  license and with the
-- copies thereof may not be provided or otherwise made available to any
-- other person. No title to and ownership of  the  software  is  hereby
-- transferred.
--
-- The information in this software is subject to change without notice
-- and should not be construed as a commitment by EMC Corporation.
--
-- EMC Corporation assumes no responsibility for the use or reliability
-- of this software.
--
----------------------------------------------------------------------------
--
--
-- EMC Celerra Management Information Base description
--
----------------------------------------------------------------------------
----------------------------------------------------------------------------
--
-- Author Identification
--
-- gma      Gary Ma, EMC
-- WZ       Weining Zhu, EMC
-- alc      Angela Cocks, EMC
--
----------------------------------------------------------------------------
--
--  003  alc   07-19-02   Added Web GUI event
--  002  WZ    07-02-02   Added Jserver Alert trap type
--  001  WZ    04-18-01   Added Control Station started trap type
--  000  gma   11-05-98   Created Original Module
--
----------------------------------------------------------------------------
EMC-CELERRA DEFINITIONS ::= BEGIN
   IMPORTS
       enterprises, Opaque
 FROM RFC1155-SMI
       DisplayString
          FROM RFC1213-MIB
       OBJECT-TYPE
          FROM RFC-1212
       TRAP-TYPE
          FROM RFC-1215;
--     emc
--        FROM EMC-MIB;

       emc OBJECT IDENTIFIER ::= { enterprises 1139  }
       emcCelerra OBJECT IDENTIFIER ::= { emc 2 }
-------------------------------------------------------------------
--
--       Celerra Event Group
--
-------------------------------------------------------------------
       celEventTable OBJECT-TYPE
          SYNTAX SEQUENCE OF CelEvent
          ACCESS not-accessible
          STATUS mandatory
          DESCRIPTION
                   "A table containing information
   about an particular event."
          ::= { emcCelerra 1}
       celEvent OBJECT-TYPE
          SYNTAX CelEvent
          ACCESS not-accessible
          STATUS mandatory
          DESCRIPTION
                   "Information about an particular event."
          INDEX {celEventFacility,
                 celEventID}
          ::= { celEventTable 1}
       CelEvent ::= SEQUENCE { celEventFacility INTEGER,
                               celEventID INTEGER,
                               celEventSeverity INTEGER,
                               celEventDescr DisplayString}
                           
       celEventFacility OBJECT-TYPE
          SYNTAX INTEGER
          ACCESS read-only
          STATUS mandatory
          DESCRIPTION
                 "The number representing the facility which generates
                  the event. For now, the value could be:
                  first 128 - default Dart facility
                  129 - master control
                  130 - event log
                  131 - box monitor
                  132 - video service
                  133 - callhome application
                  134 - AAF backup control station."
          ::= { celEvent 1 }
       celEventID OBJECT-TYPE
          SYNTAX INTEGER
          ACCESS read-only
          STATUS mandatory
          DESCRIPTION
                  "The event id which identifies the particular event
                  within a facility."
          ::= { celEvent 2 }
       celEventSeverity OBJECT-TYPE
          SYNTAX INTEGER
          ACCESS read-only
          STATUS mandatory
          DESCRIPTION
                   "Severity of the event."
          ::= { celEvent 3 }
       celEventDescr OBJECT-TYPE
          SYNTAX DisplayString
          ACCESS read-only
          STATUS mandatory
          DESCRIPTION
                   "text description of the event."
          ::= { celEvent 4 }
     
----------------------------
--
--     Trap definitions
--
----------------------------
       celReboot TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of a Data Mover
                    Reboots. The trap message includes the facility, event id,
                    serverity and a text description of the event."
          ::= 1
       celMasterCtlFault TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of Master Control
                    serious fault.
                    unexpected daemon exit or control station heartbeat
                    missing."
          ::= 2
       celHWFailure TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of celerra hardware
                    failure."
          ::= 3
       celSlotStale TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of celerra stale
                    reason code."
          ::= 4
       celSlotPanicked TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of panicked
                    slot."
          ::= 5
       celIntfFailure TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of both interfaces
                    failure."
          ::= 6
       celAAF TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of AAF."
          ::= 7
       celCSStart TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of Control Station started."
          ::= 8
       celJServer TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of a JServer alert."
          ::= 9
       celWebGUI TRAP-TYPE
          ENTERPRISE emcCelerra
          VARIABLES { celEvent }
          DESCRIPTION
                   "Trap message will be sent in the event of a Web GUI notification request."
          ::= 10
END



Nos vamos a Centreon y seleccionamos Configuration  Services  Manufacturer y hacemos click en Add . Añadiremos EMC como nuevo fabricante.  Luego iremos a Configuration  Services  MIBs y seleccionaremos nuestro fabricante "EMC" y buscaremos nuestro fichero. 

Si todo hay ido bien nuestras MIBS estarán dentro de la base de datos de Centreon.


Para que se distribuya está información de la MIBS a snmptt, se ha de ir a Configuration  Nagios  Snmp traps y hacer click en Generate.

Creamos las respectivas alarmas y les asignamos sus respectivas MIBs. Con esto ya tendriamos configuradas las alertas  y traps.

Podeis ver más captura y detalles en el siguiente link:

Troubleshooting

Aquí es donde hay que empezar ha hacer un seguimiento del mensaje y comprobar donde se rompe la cadena. 

Crearemos un nuevo host y copiaremos las alertas de servicio para poder hacer pruebas desde nuestro PC. Al lanzar las traps de SNMP desde mi equipo funcionan.

Llegan al SNMPD y SNMPTRAP lo envia a SNMPTT:

Mar  7 09:13:31 myserver snmptrapd[17706]: 2013-03-07 09:13:31 PROVA(via UDP: [192.168.1.2]:57566) TRAP, SNMP v1, community public   .1.3.6.1.6.3.1.1.5.2 Cold Start Trap (0) Uptime: 1:06:38.49     .1.3.6.1.4.1 = STRING: "hello"

SNMPTT generá el comando y lo inserta en Centreon.

EXEC command:/usr/share/centreon/bin/centTrapHandler-2.x 192.168.1.2 PROVA .1.3.6.1.4.1.1139.2.0.1 "Trap message will be sent in the event of a Data Mover 'NOK'" "'NOK' "

Funciona!!

Vamos a probar de enviar el trap desde el NAS para ver cual es el resultado:

Llega al SNMPD y SNMPTRAP lo envia a SNMPTT:

Mar  7 15:00:18 mynas snmptrapd[8875]: 2013-03-07 15:00:18 mynas.mycompany.com [192.168.1.3] (via UDP: [192.168.1.3]:39813) TRAP, SNMP v1, community public        .1.3.6.1.4.1.1139.2 Enterprise Specific Trap (2) Uptime: 195 days, 16:36:06.76  .1.3.6.1.4.1.1139.2.1.1.1 = INTEGER: 81 .1.3.6.1.4.1.1139.2.1.1.2 = INTEGER: 6  .1.3.6.1.4.1.1139.2.1.1.3 = INTEGER: 3  .1.3.6.1.4.1.1139.2.1.1.4 = STRING: "Mar  7 14:53:13 2013 VC:3:6 Slot 2: 1362664806: No virus checker server is available. Virus checking is stopped."

SNMPTT generá el comando.... pero no lo inserta en Centreon!!

EXEC command:/usr/share/centreon/bin/centTrapHandler-2.x 192.168.1.2 mynas .1.3.6.1.4.1.1139.2.0.2 "Trap message will be sent in the event of Master Control '81' '6' '3' 'Mar  7 14:53:13 2013 VC:3:6 Slot 2: 1362664806: No virus checker server is available. Virus checking is stopped.'" "'81' '6' '3' 'Mar  7 14:53:13 2013 VC:3:6 Slot 2: 1362664806: No virus checker server is available. Virus checking is stopped.' 
Para ver que problema da, ejecutamos el comando a ver que error nos muestra.

# perl -w /usr/share/centreon/bin/centTrapHandler-2.x 192.168.1.2 mynas .1.3.6.1.4.1.1139.2.0.2 "Trap message will be sent in the event of Master Control '81' '6' '3' 'Mar  7 14:53:13 2013 VC:3:6 Slot 2: 1362664806: No virus checker server is available. Virus checking is stopped.'" "'81' '6' '3' 'Mar  7 14:53:13 2013 VC:3:6 Slot 2: 1362664806: No virus checker server is available. Virus checking is stopped.' "7: -c: line 0: unexpected EOF while looking for matching `"'7: -c: line 1: syntax error: unexpected end of file

Al parecer no está recogiendo correctamente los parámetros. Los espera entre comillas pero se encuentra un espacio en blanco.

Solución

Tras seguir el script de perl para ver que es lo que hacia, decido mirar en los foros de soporte de Centreon para ver si alguien se había encontrado en el mismo caso... y Eureka!!!

Tal y como comentan en el siguiente link, el proceso de snmptrap es complejo y tiene problemas con el tratamiento de las cadenas:
http://forge.centreon.com/issues/3218

La solución que se aporta es sustituir el sistema de snmptt por un script nuevo en perl que controla todas estás excepciones:
http://forge.centreon.com/issues/3546#change-11678

Aunque el nuevo sistema de traps estará por defecto en la versión 2.5 de Centreon, lo implementamos en la versión 2.4 y funciona sin problemas. Aleluya!!

Espero que os haya ayudado!!! Saludos!!

Algunos links de interés

http://en.doc.centreon.com/HowToManageSNMPTraps
http://www.net-snmp.org/wiki/index.php/TUT:snmptrap
http://snmptt.sourceforge.net/docs/snmptt.shtml