martes, 9 de septiembre de 2014

Auto Provisioning / Config - Telefonos IP Grandstream

Una vez mas amigos virtuales les traigo un poco de pelotudeces cuando estoy aburrido conocimiento que queria compartir con ustedes.
Hoy les voy a mostrar como configurar automaticamente los telefonos IP de la marca Grandstream, en mi caso en la oficina ya hay aproximadamente 60 internos y es medio engorroso el mantenimiento. Con esta herramienta literalmente es una PAVADA hacerlo. La configuracion se maneja desde un servidor centralizado y los telefonos se actualizan automaticamente cada vez que se bootean .

Elementos necesarios


*1 servidor dhcp como la gente
*1 servidor tftp
*1 o mas telefonos Grandstream
*1 servidor de telefonia ip (asterisk, elastix, etc etc etc).
*jdk instalada en el server que contenga los scripts (preferentemente /usr/local/java )


Como funciona?

Primero se configura el dhcp que tengamos en nuestra red, agregar la opcion 66 con la ip del servidor tftp que tengamos en nuestra lan.  Esta opcion es particular en cada dhcp, por ejemplo yo uso pfsense y desde la gui se configura.

Al hacer esto, los telefonos al bootear van a buscar un archivo llamado cfgXXXXXXXXXXXX (donde XXXXXXXXX es el numero de macaddress del telefono).
Lo que basicamente debemos hacer es provisionar de esos archivos a cada telefono. Para esto Grandstream ofrece una herramienta de configuracion para generar los archivos (http://www.grandstream.com/index.php/support/tools), pero es una cagada un poco limitada a la hora de generar muchas configuraciones a la vez.

Gracias a mi amigo personal y python estrella Enrique, se resolvio mediante un script en python y un archivo csv, que es donde van las variables a configurar. En otro archivo llamado cfgMAC es donde se configuran los datos estaticos de configuracion, como se muestra a continuacion:
#-----------------------------------------------------------------------------
# You must change this section for your phone
# Compatible with Grandstream GXP and GXV series phones
#-----------------------------------------------------------------------------
# Admin password for web interface
P2 = phoneadmin1
# SIP Server
P47 = asterisk.ejant.edu
# Outbound Proxy
P48 = asteriskejant.edu
# SIP User ID
P35 = $EXT
# Authentication ID
P36 = $USER
# Authentication password
P34 = $SECRET
# NAT Traversal. 0 - yes, 1 - no
P52 = 0
# STUN server
P76 =
#-----------------------------------------------------------------------------
# Network settings
#-----------------------------------------------------------------------------
# DHCP support. 0 - yes, 1 - no
P8 = 1
# PPPoE support. PPPoE user ID
P82 =
# PPPoE password
P83 =
# IP Address. Ignore if DHCP or PPPoE is used
P9 = 192
P10 = 168
P11 = 11
P12 = $IP
# Subnet mask. Ignore if DHCP or PPPoE is used
P13 = 255
P14 = 255
P15 = 248
P16 = 0
# Router. Ignore if DHCP or PPPoE is used
P17 = 192
P18 = 168
P19 = 10
P20 = 1
# DNS 1. Ignore if DHCP or PPPoE is used
P21 = 192
P22 = 168
P23 = 10
P24 = 12
# DNS 2. Ignore if DHCP or PPPoE is used
# IP Address. Ignore if DHCP or PPPoE is used
P9 = 192
P10 = 168
P11 = 11
P12 = 4
# Subnet mask. Ignore if DHCP or PPPoE is used
P13 = 255
P14 = 255
P15 = 248
P16 = 0
# Router. Ignore if DHCP or PPPoE is used
P17 = 192
P18 = 168
P19 = 10
P20 = 1
# DNS 1. Ignore if DHCP or PPPoE is used
P21 = 192
P22 = 168
P23 = 10
P24 = 12
# DNS 2. Ignore if DHCP or PPPoE is used
P25 = 192
P26 = 168
P27 = 10
P28 = 3
# Firmware Upgrade Via. 0 - TFTP Upgrade,  1 - HTTP Upgrade, 2 - HTTPS Upgrade
P212 = 0
# Firmware Server Path
P192 = tftp.ejant.edu

# Config Server Path
P237 = tftp.ejant.edu


# Use Random Port. 0 - no, 1 - yes
P78 = 0

# Local SIP port (default 5060)
P40 = 5060

# Local RTP port (1024-65535, default 5004)
P39 = 5004




Basicamente el script completa las variables que faltan ($IP, $EXT,$NAME,$USER,$SECRET) con los datos que tiene el archivo config.csv:

MAC,IP,EXT,USER,SECRET,NAME
000b821caaa8,16,601,601,5454,Demo User
000b821caab8,17,602,602,5454,Demo User

Por cada interno agregar una linea.

La aplicacion la bajan de este link 

Descomprimir en /opt

cd grandstream

y ahi van a encontrar los siguientes archivos:

*cfgMAC (es el archivo main de configuracion)
*config.csv (tiene los datos variables)
*config_generator.py
*configs (carpeta donde se genera los archivos de config)
*configs_bin (carpeta donde se encriptan los archivos para subir)
*generador.sh (binario para ejecutar)

Nota: el archivo generador.sh copia los archivos generados en /tftpboot en caso de necesitar que se copie en otro lado

una vez hecho el config.csv, seteados los parametros en el archivo cfgMAC... ejecutar generador.sh


[root@joshua grandstream]# ./generador.sh 
generando archivos.... aguarde

copiando archivos generados al directorio /tftpboot
listo!

si vamos al directorio /tftpboot veremos los archivos creados

-rw-r--r--   1 root root  688 Sep  9 12:25 cfg000b825b8c46
-rw-r--r--   1 root root  704 Sep  9 12:25 cfg000b825b8c43


y si todo sale bien....

 in.tftpd[18523]: RRQ from 192.168.11.61 filename cfg000b825b8c46


Listo, el telefono toma la config automaticamente se reinicia y se configura solo.



Espero que les sirva, y no se olviden, compartir es amor (L)(L)(L)

lunes, 23 de septiembre de 2013

 Reportes Automaticos en Nagios

Una vez mas aportando otra pelotudez herramienta al servicio del administrador de redes.
Hoy vamos a ver como se le dice a un servidor Nagios que nos mande un reporte automatico de algun grupo de servicios o de hosts.

Elementos necesarios
*1 cuenta de mail
*1 server con Nagios instalado
* Algo que monitorear en el Nagios.

Antes que nada se deben instalar los siguientes paquetes...

yum install -y wget python-pip python-devel python-setuptools

Para poder exportar el reporte a pdf lo hice con xhtml2pdf.
Descargo xhtml2pdf e instalo....


wget --no-check-certificate https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.5.tar.gz#md5=1ef268b40c11bf966f7c6c5504299e3e
tar -xzvf xhtml2pdf-0.0.5.tar.gz
cd xhtml2pdf-0.0.5
chmod 755 setup.py
./setup.py install

Ahora instalar mailsend, para poder enviar adjuntos mas facil (por lo menos para mi)


wget https://mailsend.googlecode.com/files/mailsend1.16.tar.gz
tar -xzvf mailsend1.16.tar.gz
cd mailsend1.16
./configure
 make
cp mailsend /usr/sbin

Para poder generar el reporte, hay que armar la url para traerlo.... x ejemplo en mi caso las variables son los datos de la fecha a obtener el reporte.


#!/bin/bash
#reportes nagios automaticos#
#defino variables
#ultimo dia del mes anterior
LASTDAY=$(cal -3 |awk 'NF{last=$NF}END{print last}')
#ultimo mes anterior
LASTMONTH=$(date +%m --date="last month")
#año
YEAR=$(date +%Y)
cd /tmp
################Reporte Nagios
# obtengo html#
wget -v --user tuadmindenagios --password 'tupassword' -O ./`date +%d%m%Y`-report.html "http://tu.url.de.nagios/nagios/cgi-bin/avail.cgi?show_log_entries=&servicegroup=tu.servicegroup&timeperiod=lastmonth&smon=$LASTMONTH&sday=1&syear=$YEAR&shour=0&smin=0&ssec=0&emon=$LASTMONTH&eday=$LASTDAY&eyear=$YEAR&ehour=24&emin=0&esec=0&rpttimeperiod=&assumeinitialstates=yes&assumestateretention=yes&assumestatesduringnotrunning=yes&includesoftstates=no&initialassumedhoststate=0&initialassumedservicestate=0&backtrack=4"
#borro lineas que no necesito en el html, basicamente le saco el encabezado al html porque no me gusta, no es necesario hacer esto
sed '13,26d;37,100d' `date +%d%m%Y`-report.html > tmp.html
#convierto a pdf usando el css que corresponde (el css no es estrictamente necesario), yo lo cargo porque uso nagios nuvola que esta bastante lindo
xhtml2pdf --css /ruta/al/css/avail.css -d tmp.html reporte-`date +%d%m%Y`.pdf
#envio el reporte por correo
mailsend -to "tu.mail@tu.dominio" -from nagios@tu.dominio -smtp tu.smtp -sub "Reporte Nagios" -M "Reporte Nagios" -attach "/tmp/reporte-`date +%d%m%Y`.pdf"  -name "ReporteNagios"

En el caso de necesitar otro reporte, hay que cambiar el servicegroup por hostgroup, etc.

Espero que les haya servido, hasta la proxima!





martes, 26 de febrero de 2013

Monitoreando placa Raid 3ware en XenServer con Nagios por ssh

Monitoreando Placa Raid 3ware en Nagios por ssh

Hola amigos, otra vez aca, tratando de ayudar al admin perdido como la defensa de Boca (!)
Esta vez, veremos como monitorear el estado de un Raid en una placa 3ware...

Elementos necesarios
*1 server o mas con alguna placa raid 3ware
*1 server con Nagios instalado
*1 instalacion de xenserver 6.1 (en mi caso), por eso hago check por ssh, de lo contrario tambien puede servir cualquier otro linux
*Ganas de laburar (?)

El problema a resolver es el siguiente... tomar el estado de la controladora raid y monitorearla con Nagios.
Afortunadamente ya existe un plugin que hace todo esto, asi que vamos directo a los comandos.
Antes que nada descargar el siguiente archivo
http://www.lsi.com/Pages/user/eula.aspx?file=http%3a%2f%2fwww.lsi.com%2fdownloads%2fPublic%2fSATA%2fSATA%2520Common%2520Files%2f3DM2_CLI-linux_10.2.2.1_9.5.5.1.zip&Source=http%3a%2f%2fwww.lsi.com%2fdownloads

copiar el zip al equipo que se quiere monitorear en el /tmp 

Una vez copiado el archivo... ejecutar



cd /tmp unzip 3DM2_CLI-linux_10.2.2.1_9.5.5.1.zip 
chmod 755 install.sh 
./install.sh -i -fN0
wget -c "http://exchange.nagios.org/components/com_mtree/attachment.php?link_id=652&cf_id=29" -O check_3ware_raid 
mv check_3ware_raid /usr/sbin/ 
#Agrego a Nagios al sudoers 
echo "nagios ALL=(ALL) NOPASSWD: /usr/sbin/check_3ware_raid" >> /etc/sudoers 
# Elimino el requiretty para poder chequear por ssh 
sed -i '/requiretty/d' /etc/sudoers 


Ahora en el servidor Nagios.... Editar el archivo commands.cfg, y agregar....

 # check_3ware command definition 
 define command 

command_name check_ssh_3ware 
command_line $USER1$/check_by_ssh -H $HOSTADDRESS$ -t 240 -C "sudo /usr/sbin/check_3ware_raid" 

Nota: Agregue el -t 240 porque en mi caso tarda casi 2 minutos el comando en devolver el resultado
Luego agregar en la definicion del host el check

define service

use generic-service 
host_name Nombredelservidor
service_description 3Ware Raid Status 
is_volatile 0 
check_period 24x7 
max_check_attempts 3 
normal_check_interval 5 
retry_check_interval 1 
contact_groups IT 
notification_interval 2500 
notification_period 24x7 
notification_options w,u,c,r 
check_command check_ssh_3ware
}
Y eso es todo, para mas info de como monitorear un XenServer por ssh: 
http://support.citrix.com/article/CTX127562


miércoles, 16 de enero de 2013

Nrpe en Freenas 8.3



Hola a todos, hoy les traigo una nueva receta, como instalar nrpe en freenas 8.3.

Elementos necesarios:

1 instalacion de Nagios (www.nagios.org)
1 Freenas 8.3 (www.freenas.org)
1 teclado o 1 cliente ssh para poder hacerlo

Como primer medida para poder trabajar en Freenas hay que montar el disco en modo lectura, para esto loguearse al equipo en cuestion y ejecutar

mount -uw /
Luego hay que bajar unos cuantos paquetes que pondremos en el /tmp, puede ser otra carpeta si asi les guste

cd /tmp
fetch ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.3-release/All/perl-5.12.4_4.tbz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.3-release/All/libiconv-1.13.1_2.tbz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.3-release/All/gettext-0.18.1.1.tbz
fecth ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.3-release/All/nagios-plugins-1.4.15_1,1.tbz
fetch ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.3-release/All/nrpe-2.13.tbz
 
Una vez bajado todo hay que instalar.....

pkg_add perl-5.12.4_4.tbz
pkg_add libiconv-1.13.1_2.tbz
pkg_add gettext-0.18.1.1.tbz
pkg_add nagios-plugins-1.4.15_1,1.tbz
pkg_add nrpe-2.13.tbz
rm perl-5.12.4_4.tbz
Borro archivos...

rm perl-5.12.4_4.tbz
rm libiconv-1.13.1_1.tbz
rm gettext-0.18.1.1.tbz
rm nagios-plugins-1.4.15_1,1.tbz
rm nrpe-2.12_3.tbz
Para poder monitorear zfs existe un comando para nagios llamado check_zpool, bajarlo de ESTE LINK y copiarlo en /usr/local/libexec/nagios y aplicar permisos sobre este check y el de memoria ya que no tienen permiso de ejecucion

chmod 755 /usr/local/libexec/nagios/check_zpool /usr/local/libexec/nagios/check_mem
Agregar la siguiente linea a /conf/base/etc/rc.conf (para que inicie con el equipo)
 nrpe2_enable="YES"
Ahora crear el archivo /conf/base/etc/rc.d/nrpe2 conteniendo lo siguiente:

#!/bin/sh
#
# $FreeBSD: ports/net-mgmt/nrpe2/files/nrpe2.in,v 1.5 2010/03/27 00:14:26 dougb Exp $
#
# PROVIDE: nrpe2
# REQUIRE: NETWORKING
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf to enable nrpe2:
# nrpe2_enable (bool): Set to "NO" by default.
# Set it to "YES" to enable nrpe2.
# nrpe2_flags (str): Set to "" by default.
# nrpe2_configfile (str): Set to "/usr/local/etc/nrpe.cfg" by default.
# nrpe2_pidfile (str): Set to "/var/spool/nagios/nrpe2.pid" by default.
#
. /etc/rc.subr
name="nrpe2"
rcvar=`set_rcvar`
command="/usr/local/sbin/nrpe2"
command_args="-d"
extra_commands="reload"
sig_reload=HUP
[ -z "${nrpe2_enable}" ] && nrpe2_enable="NO"
[ -z "${nrpe2_configfile}" ] && nrpe2_configfile="/conf/base/etc/nrpe.cfg"
[ -z "${nrpe2_pidfile}" ] && nrpe2_pidfile="/var/spool/nagios/nrpe2.pid"
load_rc_config "${name}"
pidfile="${nrpe2_pidfile}"
required_files="${nrpe2_configfile}"
command_args="${command_args} -c ${nrpe2_configfile}"
run_rc_command "$1"
Aplico permisos...

chmod 755 /conf/base/etc/rc.d/nrpe2
y finalmente el archivo de configuracion de nagios y sus comandos llamado /conf/base/etc/nrpe.cfg

Ahi va un ejemplo

log_facility=daemon
pid_file=/var/spool/nagios/nrpe2.pid
server_port=5666 (en este puerto escucha el demonio nagios)
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=tu.ip.de.nagios
dont_blame_nrpe=0
debug=0
command_timeout=60
connection_timeout=300
command[check_load]=/usr/local/libexec/nagios/check_load -w 15,10,5 -c 30,25,20
command[check_disk]=/usr/local/libexec/nagios/check_disk -w 20% -c 10% -p /punto/de/mon/taje
command[check_zpool]=/usr/local/libexec/nagios/check_zpool
command[check_mem]=/usr/local/libexec/nagios/check_mem -u -w 80 -c 90
Ahora para iniciar, ejecutar

service nrpe2 start

Y listo!
Hasta la proxima

jueves, 2 de agosto de 2012

Monitoreando Tuneles IPSec con Nagios en Pfsense

Volvi, aunque no me hayan extrañado.....

Hoy les voy a explicar como hacer para monitorear IPSec/Racoon en pfsense 2.x

Elementos
1 instalacion de Pfsense (http://pfsense.org)
1 instalacion de Nagios (http://nagios.org)
1 cliente ssh / sftp

No voy a explicar como instalar nagios ni pfsense, si no sabes esta pagina no es para vos y podes volver a taringa o al twitter de tn tecno (!)...

Primero... se debe instalar el agente de nagios para pfsense, esto es una pavada, hay que ir a System > Packages
 luego en Available buscar el que dice NRPE V2, como se muestra en la foto





Hacer click en el "+" y blablabla

Ahora, con nuestro cliente ssh favorito debemos subir el archivo que chequea los tuneles IPSec, que es el siguiente (NOTA: aclaro que parte del script me lo robe de por ahi porque soy de madera haciendo scripts...)


PARM1="$1"
WARN="$2"
PARM2="$3"
CRIT="$4"

if [ $PARM2 != "-c" -o $CRIT = "" ] ; then
    echo "UsageL $0 -w -c "
if [ "$PARM1" != "-h" ]; then
        exit 3
    else
        echo ""
        echo " -w = Minimum Ipsec tunnel Numbers warning."
        echo " -c = Critical Ipsec tunnel number."
        echo " -h = help."
        exit 3

    fi
fi


NUMBER=$(sudo racoonctl -l show-sa isakmp | awk 'int ($9)' | wc -l)

HOSTNAME=$(hostname)


if [ $NUMBER -le $CRIT ]; then
    echo "Critical  - Total IpSec detected tunnels: $NUMBER"
    exit 2
else
    if [ "$NUMBER" -le "$WARN" ]; then
        echo "Warning  - detected tunnels: $NUMBER"
        exit 1
    else
        echo "OK: \"$HOSTNAME\" is running: $NUMBER Ipsec Tunnels"
        exit 0
    fi
fi

Basicamente lo que hace este script es usar el comando racoonctl para ver que tuneles estan activos y con awk hago la cuenta de cuantos han pasado phase2.




Se debe copiar en la carpeta /usr/local/libexec/nagios/ con el nombre check_ipsec

Ahora lo que falta es, como se ve en el script editar el sudoers, peeeeero.. pfsense NO tiene sudo, asi que tendremos que instalarlo. Dentro del equipo ejecutar:

PARA 32 BITS:

# pkg_add -r ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/sudo.tbz

PARA 64 BITS:

# pkg_add -r ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8-stable/Latest/sudo.tbz


Listo, instalado el visudo,  seguramente les dara un warning, pero no pasa nada. Ahora se debe editar el sudoers,

#/usr/local/sbin/visudo

y en la ultima linea agregar lo siguiente:

nagios ALL=(ALL) NOPASSWD: /usr/local/sbin/racoonctl
nagios ALL=(ALL) NOPASSWD: /usr/local/libexec/nagios/check_ipsec



honestamente, no se si hace falta el check_ipsec, yo por las dudas lo puse

Una vez hecho esto, hay que configurar el plugin desde la gui del pfsense, va una captura como ejemplo, los valores de warning y critical manejenlos de acuerdo a lo que necesiten





y listo el pollo pelada la gallina, espero que les sea util ya que esto no lo vi por ningun lado

hasta la proxima cyberamigos, que les garue finito y ojo con los hackers

jueves, 22 de diciembre de 2011

ISCSi Persistente en CentOS

Volvi, en forma de fichas.....

Hoy les presentare, estimados lectores, como solucionar uno de los grandes problemas con el mapeo de unidades ISCSi, la persistencia de nombres.
Generalmente al montar unidades ISCSi al reiniciar el equipo se modifica el nombre del disco, o se cruzan como es en mi caso, a saber /dev/sda se convierte en /dev/sdb al reiniciar un servidor y viceversa.

Esto se hace mediante el servicio udev, le definimos que por cada UUID de unidad ISCSi le asigne siempre el mismo dispositivo (/dev/iscsi0 /dev/iscsi1 o lo que fuere)

Primero se debe obtener el id de los discos. Se debe ejecutar el siguiente comando

 scsi_id -g -u -s /block/sda
Recordar apuntar a /block y no a /dev, esto se podria ver tambien ejecutando fdisk -l y cambiar el /dev por /block:

[root@remo ~]# fdisk -l

Disk /dev/xvdd: 117 MB, 117549056 bytes
255 heads, 63 sectors/track, 14 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/xvdd doesn't contain a valid partition table

Disk /dev/xvda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *           1          13      104391   83  Linux
/dev/xvda2              14        2610    20860402+  8e  Linux LVM

Disk /dev/sda: 12.5 GB, 12582912000 bytes
64 heads, 32 sectors/track, 12000 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Disk /dev/sda doesn't contain a valid partition table

Disk /dev/sdb: 14.6 GB, 14696841216 bytes
64 heads, 32 sectors/track, 14016 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Disk /dev/sdb doesn't contain a valid partition table

Entonces, para obtener el UUID del disco se debe ejecutar


 scsi_id -g -u -s /block/sda
14f504e46494c45524a5a5471534c2d4f69724e2d6e546164

 scsi_id -g -u -s /block/sdb
14f504e46494c45524a6b705679642d63366b312d41673268
Apuntar los UUID que seran usados mas adelante...
Ahora, se debe crear un nuevo archivo dentro de /etc/udev/rules.d llamado
20-names.rules
La sintaxis es la siguiente:


KERNEL=="sd*", BUS=="scsi",  PROGRAM="sbin/scsi_id", RESULT=="14f504e46494c45524a5a5471534c2d4f69724e2d6e546164", NAME="iscsi0"
KERNEL=="sd*", BUS=="scsi",  PROGRAM="sbin/scsi_id", RESULT=="14f504e46494c45524a6b705679642d63366b312d41673268", NAME="iscsi1"
o sea que en mi caso /dev/sdb va a llamarse /dev/iscsi1 y /dev/sda se va a llamar /dev/iscsi0

Editar el archivo /etc/scsi_id.config, comentar todas las lineas y agregar lo siguiente (en negrita)

#
# options=
# vendor=string[,model=string],options=

# some libata drives require vpd page 0x80
options=-g

Sin hacer esto NO FUNCIONA asi que no olvidarlo!!!

Ahora se debe editar el archivo /etc/rc.local y agregar /sbin/start_udev
Reiniciar el equipo y listo!
No olvidar de cambiar el /etc/fstab porque /dev/sda y /dev/sdb no existen mas luego del cambio

martes, 12 de julio de 2011

Cluster JBoss con Session Replication

En esta entrega os explicare como armar un cluster de servidores de aplicaciones Java con replicacion de sesion. He elegido JBoss porque me place (?).

Elementos

*1 aplicacion desarrollada en Java
*2 o mas servidores JBoss ya instalados. En mi caso son dos y los voy a llamar application1(192.168.70.249) y application2 (192.168.70.250)
*1 o mas servidores Apache (en mi caso son dos) con mod_jk instalado

Se asume que se parte desde una instalacion funcionando (standalone) y una aplicacion tambien funcionando. La idea es pasar de un servidor a un cluster de servidores... De todas maneras en la practica es bastante complicado y tedioso hacer este tipo de migraciones, pero me parece que vale la pena compartirlo.

Para que JBoss funcione en modo cluster se deben colocar los arhivos a desplegar en el directorio $JBOSS_HOME/server/all/deploy en cada servidor del cluster. Tambien se podria poner en el directorio $JBOSS_HOME/server/all/farm que hace el deploy automatico entre todos los nodos del cluster.

Luego, hay que modificar el script de inicio, que seria asi, por ejemplo para el servidor 1


#!/bin/bash

/usr/local/jboss/bin/run.sh -b 192.168.70.249 -c all  >/dev/null 2>&1 &

echo servicio jboss iniciado...
y modificar el arhivo de configuracion $JBOSS_HOME/bin/run.conf. En negrita esta el parametro a agregar en cada nodo del cluster:

if [ "x$JAVA_OPTS" = "x" ]; then
   JAVA_OPTS="-Xms512m -Xmx3000m  -XX:PermSize=256m -XX:MaxPermSize=512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Djboss,partition.name=cluster
-Dsun.rmi.dgc.server.gcInterval=3600000 -Duser.timezone=GMT-03:00"
Luego, en cada instancia de jboss modificar el archivo $JBOSS_HOME/server/all/deploy/jboss-web.deployer/server.xml y agregar en la siguiente linea lo que se muestra en negrita:
  
< Engine name="jboss.web" defaultHost="localhost" jvmRoute="worker1" >


En mi caso worker1 es el servidor application1.

Ahora se le debe indicar a JBoss que vamos a usar un balanceador (mod_jk). Para esto editar el archivo $JBOSS_HOME/server/all/deploy/jboss-web.deployer/META-INF/jboss-service.xml y agregar en la siguiente linea lo que se muestra en negrita:
 < attribute name="UseJK" >true< /attribute >
 Ahora, descomprimir el archivo ear a hacer deploy y editar el archivo /WEB-INF/web.xml. Agregar lo que esta en negrita:
el parameto se debe agregar dentro del contexto y NO DENTRO DE OTRO, sino NO FUNCIONA.

< web-app
        version="2.5"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >
       
       
       
    < distributable/ >

Luego, editar el archivo /WEB-INF/jboss-web.xml, y agregar lo siguiente:
< jboss-web >
 
   < replication-config >
     < replication-trigger >SET_AND_NON_PRIMITIVE_GET< /replication-trigger >
     < replication-granularity >SESSION< /replication-granularity >
    < replication-field-batch-mode >true< /replication-field-batch-mode >
     < /replication-config >

< /jboss-web >
Yo utilice SESSION replication que es lo que necesitaba, para mas info... http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/beta500/html/clustering-http-app.html


Segurizando la consola jmx

Como la replicacion entre los servidores esta hecha por medio de jms, se precisa de la consola de jboss para monitorear la replicacion se debe segurizar, de lo contrario cualquier usuario sin autenticar puede reiniciar el servidor, editar configuraciones, etc.
Editar el archivo $JBOSS_HOME/server/all/conf/login-config.xml y agregar:

       < application-policy name = "jmx-console" >
                < authentication >
                < login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
                             flag = "sufficient" >
        < module-option name="usersProperties" >props/jmx-console-users.properties< /module-option >
        < module-option name="rolesProperties" >props/jmx-console-roles.properties< /module-option >
        < /login-module >
        < /authentication >
        < /application-policy >
        < application-policy
                name="other" >
                < authentication >
                        < login-module
                                code="org.jboss.security.auth.spi.UsersRolesLoginModule"
                                flag="required" />
                < /authentication >
        < /application-policy >
Ahora, se debe editar el archivo $JBOSS_HOME/server/all/conf/props/jmx-console-users.properties (en el caso que no exista crearlo)

# A sample users.properties file for use with the UsersRolesLoginModule
admin=password_del_admin
Y tambien el archivo $JBOSS_HOME/server/all/conf/props/jmx-console-roles.properties

# A sample roles.properties file for use with the UsersRolesLoginModule
admin=JBossAdmin,HttpInvoker
En el caso de utilizar otro usuario que no sea admin, cambiarlo.

Configuracion de Apache:

Para hacer el balanceo de carga se utiliza Apache con el modulo mod_jk.
La instalacion de mod_jk requiere los siguientes paquetes (y sus dependencias que se instalaran automaticamente). Esto para CentOS / RedHat / Fedora

yum install -y httpd-devel gcc
Se baja el modulo a compilar


wget http://apache.dattatec.com//tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.32-src.tar.gz
se descomprime, se compila y se instala en cada servidor apache.

tar -xzvf tomcat-connectors-1.2.32-src.tar.gz
cd tomcat-*
./configure --with-apxs=/usr/sbin/apxs
./make
./make install
 ahora editar el archivo /etc/httpd/conf.d/workers.properties. Este archivo es el de configuracion del balanceador de carga, aqui se van a definir los nodos del cluster, el peso para distribuir el trabajo, etc

#esta es la ruta de $JBOSS_HOME
workers.tomcat_home=/usr/local/jboss
#ruta a la jdk de la aplicacion
workers.java_home=/usr/local/java
#slash (en el caso de linux / en el caso de windows \)
ps=/
#lista de workers, router seria el cluster, status es para chequear estado de los servidores
worker.list=router,status
#defino nodo 1
worker.worker1.port=8009
worker.worker1.host=192.168.70.249
worker.worker1.socket_timeout=300
worker.worker1.type=ajp13
#defino el nodo 2
worker.worker2.port=8009
worker.worker2.host=192.168.70.250
worker.worker2.socket_timeout=300
worker.worker2.type=ajp13
#defino la carga (este parametro es relacional, es decir que si a cada nodo le pongo 1, distribuira la carga 1 a 1, si el nodo 1 tiene 10 y el nodo 2 tiene 1, la relacion de trabajo es 10 a 1)
worker.worker1.lbfactor=1
worker.worker2.lbfactor=1
#defino tipo de balanceo (lb=loadbalancing) 
worker.router.type=lb
worker.router.balance_workers=worker1,worker2
#defino que la sesion persista en cada worker
worker.router.sticky_session=1
worker.inprocess.type=jni
worker.status.type=status
Por ultimo, se define el virtual host y como sera montado por apache, en /etc/httpd/conf.d/vhosts.conf 
#Cargo el modulo compilado anteriormente
LoadModule jk_module modules/mod_jk.so
NameVirtualHost *
ServerName nombredelservidor
ServerSignature Off
#llamo a workers.properties
JkWorkersFile /etc/httpd/conf.d/workers.properties
# Defino los logs
JkLogFile /var/log/httpd/mod_jk.log
# log level [debug/error/info]
JkLogLevel debug
# Formato de log
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
kRequestLogFormat "%w %V %T"
JkShmFile /var/log/httpd/jk.shm
ServerAlias 1.2.3.4
ServerAdmin support@pepe.com
DocumentRoot /var/www/vhosts/
ErrorLog logs/cluster_error
CustomLog logs/cluster-access_log common
#envio los requests al cluster (llamado router) JkMount * router


Esto es todo por hoy amiguitos, cualquier duda, puteada o lo que quieran me avisan.
Un saludo a todos los que me conocen