JBoss CLi desde Ansible

JBoss CLi desde Ansible

Ejecutar comandos en JBoss Cli para modificar la configuración, agregar nueva funcionalidad, cambiar prioridades de los logs para encontrar problemas, o configurar un JBoss para una nueva aplicacion es una tarea muy facil, pero cuando se tienen varios cluster de servidores JBoss, varias instancias en un mismo servidor virtual, o crear containers de docker que se configure automaticamente para desplegar una aplicacion, la tarea con JBoss cli se vuelve un muy dificil.

Con la aparacicion de sistemas como chef y puppet esta tarea se vuelve un poco mas facil, pero ejecutar en estos entornos comandos JBoss-Cli es un poco complicado. Con la llegada de Ansible esto se volvio mas facil, el inconveniente es que hasta el momento no existe un modulo para conectarse a JBoss Cli y ejecutar comandos.
Cuando vi la necesidad de ejecutar comandos de JBoss Cli desde Ansible me di cuenta que los playbook y los comandos se volvian muy grandes y podian fallar y que era necesario crear un modulo, con esto en mente desarrolle un Modulo el cual pongo a su dispocicion para ejecutar comandos de JBoss Cli en ansible

El código lo pueden obtener desde mi repo en GitHub: https://github.com/Wolfant/ansible-jbossCli

El uso es muy facil primero debes clonar el repo, y copiar el archivo jbosscli.py en la carpeta de modulos de ansible comunmente en:

/usr/lib/python2.7/site-packages/ansible/modules/web_infrastructure

Con esto ya se puede empezar a usar el modulo desde PlayBooks o comandos simples

Ejemplo:

Para cambiar el intervalo del Deployement scaner:

- jboss:
    command: /subsystem=deployment-scanner/scanner=default:write-attribute(name=scan-interval,value=6000)
    cli_path: /home/user/wildfly-10.1.0.Final/bin

Si se tiene una clave generica para la autenticacion de JBoss CLi recomiendo configurar directamente en el codigo:


module = AnsibleModule(
argument_spec=dict(
src=dict(),
user=dict(default='USUARIO'),
password=dict(default='CONTRASEÑA'),
command=dict(),
cli_path=dict(default='/usr/share/wildfly/bin'),
server=dict(default='localhost:9990'),
verbose=dict(default="False"),
),
mutually_exclusive=[['command', 'src']],
)

Instalacion de Jboss 6.2 en RHEL 7/CentOs 7

Con el reciente lanzamiento de  de RHEL 7, los manuales anteriores quedaron en la nada.

Muchas personas dicen que Jboss no se instala solo se descomprime, pero en verdad descomprimir jboss en /opt no es profesional ni es una buena practica para producción. Por lo que voy a escribir la forma correcta de instalarlo en RHEL7.

Antes de empezar voy a decir dos diferencias sustanciales que puede demorarnos en la instalación, primero RHEL 7 viene con firewallD [1]  por lo que iptables no nos va a servir para abrir los puertos necesarios, y para crear el servicio de inicio de Jboss ya no se usa los init scripts de sysV, ahora RHEL es un sistema basado en systemd [2] por lo que se debe usar systemctl y no el clásico comando service

Pues bien empecemos con la instalación:

Recuerde que debe tener instaldo Oracle JDK o el OpenJdk para que jboss funcione.

Primero debemos crear el usuario jboss

# adduser -r jboss
# mkdir /home/jboss
# chown -R jboss:jboss /home/jboss

Con estos comandos creamos un usuario del sistema con nombre jboss y creamos el home que el entrega. Para algunos war me ha dado problema que el usuario jboss no tenga home, un ejemplo de esto es el war de jenkins [3]

ahora debemos descomprimir el jar o el zip de Jboss en la carpeta donde debe ir,  se recomienda que este en /usr/share/jboss

# unzip jboss-eap-6.2.0.zip -d /usr/share/
# mv jboss-eap-6.2 jboss-as
# chown -R jboss:jboss jboss-as

Creamos la carpeta donde va a residir los archivos de configuración, copiamos el archivo de configuración que viene con el zip, damos permisos al usuario.

# mkdir /etc/jboss-as
# cp /usr/share/jboss-as/bin/init.d/jboss-as.conf /etc/jboss-as/
# chown -R jboss:jboss /etc/jboss-as/

El archivo de configuración por defecto viene completamente comentado, quitamos el comentario de las lineas:

JBOSS_USER=jboss
STARTUP_WAIT=30
SHUTDOWN_WAIT=30
JBOSS_CONSOLE_LOG=/var/log/jboss-as/console.log

Notese que el usuario es jboss no jboss-as

Ahora debemos crear el directorio para el pid y para el log

# mkdir -p /var/log/jboss-as/
# chown -R jboss:jboss /var/log/jboss-as/
# mkdir -p /var/run/jboss-as/
# chown -R jboss:jboss /var/run/jboss-as/

Ahora debemos crear el servicio systemd para iniciarlo.  Los servicios en systemd se alojan en dos lugares el principal o de mas precedencia  es: /etc/systemd/system/  Comúnmente los archivos en este directorio son links simbólicos del segundo directorio, el cual es: /lib/systemd/system/

Como es un archivo nuevo lo agrego en /etc/systemd/system/ y lo guardo con el nombre jboss.service

# vim /etc/systemd/system/jboss.service

# Systemd unit file for Jboss
#
# Wolfant Example

[Unit]
Description=Jboss Application Server
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/share/jboss-as/bin/init.d/jboss-as-standalone.sh start
ExecStop=/usr/share/jboss-as/bin/init.d/jboss-as-standalone.sh stop
PIDFile=/var/run/jboss-as/jboss-as-standalone.pid

[Install]
WantedBy=multi-user.target

Después de crear el archivo debemos reiniciar el servicio de systemd

# systemctl daemon-reload

y por ultimo probar iniciar, detener y revisar el estado del nuevo servicio.

# systemctl start jboss.service
# systemctl status jboss.service
# systemctl stop jboss.service

Para que Jboss funcione los puertos que debemos abrir dependiendo de la configuración de nuestro Jboss son:

  • 80/TCP
  • 443/TCP
  • 8080/TCP

Opcional (No recomendado si esta conectado directo al Internet):

  • 9990/TCP
  • 9999/TCP

Estos puertos se abren en firewallD con los siguientes comandos:

# firewall-cmd --permanent --zone=public --add-port=8080/tcp

# firewall-cmd --permanent --zone=public --add-service=https

# firewall-cmd --permanent --zone=public --add-service=http

# firewall-cmd --permanent --zone=public --add-port=9990/tcp

# firewall-cmd --permanent --zone=public --add-port=9999/tcp

# systemctl restart firewalld.service

Si deseamos revisar si restan los puertos abiertos usamos:

firewall-cmd --permanent --zone=public --list-all
Referencias:
[1]https://fedoraproject.org/wiki/FirewallD

[2]http://0pointer.de/blog/projects/systemd-for-admins-3.html

https://fedoraproject.org/wiki/Systemd/es#.C2.BFC.C3.B3mo_personalizar_un_archivo_unidad_o_agregar_uno_personalizado.3F

 [3] http://jenkins-ci.org/