Deployments remotos en Jboss con Fabric (Python)

Fabric es una librería de Python que facilita enormemente a los administradores la automatización de tareas remotas por SSH, lo que se traduce en más tiempo para hacer otras cosas y menos ingesta de cafés. Monitorización, inicio y parada de servicios, deployments en servidores de aplicaciones y mucho más se pueden realizar con Fabric. Vamos a ver un sencillo ejemplo de cómo realizar un deploy en Jboss de un servidor remoto desde nuestro escritorio.

Preparando nuestro entorno para utilizar Fabric

Instalación de Python

Ni que decir cabe que debemos tener instalado previamente Python. Es recomendable utilizar Python 2.5 ó 2.7. Para versiones más antiguas ya no hay soporte y en las más nuevas versiones de Python 3 no ha sido testeado lo suficiente aunque tienen planeado portarlo completamente en el futuro (llevo oyendo lo de las portabilidades a Python 3.X de ciertos módulos desde hace años, no perdamos la esperanza)

En mi caso para realizar las pruebas he instalado Python 2.7 en un Windows (-___-). ¿Por qué? No es de extrañar que nos encontremos trabajando desde una Workstation con Windows, de ahí la razón. Si es desde una distro Linux el proceso de instalación es aún más fácil ya que Python suele estar en los repos de todas las distros conocidas Debian/Red Hat y derivadas de las mismas.

Instalación de Pip para gestionar paquetes de Python

Para instalar Fabric recomendaría utilizar pip si es que no lo ha instalado directamente el paquete de Python. Para ello podemos seguir las instrucciones oficiales. Básicamente, lo descargamos y después lo instalamos con:

python get-pip.py

Instalación de Fabric

Una vez instalado Python y pip procederemos a instalar Fabric. Si estáis en Windows necesitaréis tener instalado previamente el Compilador para Python Microsoft Visual C++. Desde cmd o terminal podemos utilizar pip, creo que la manera más sencilla que además es la que recomiendan. Puede que al instalar Fabric nos instale el resto de dependencias, pero lo pongo por si acaso:

pip install fabric
pip install pycrypto
pip install ecdsa

Ejemplo de deployment remoto en Jboss utilizando Fabric

Para echar un vistazo general a las capacidades de Fabric vamos a utilizar un ejemplo sencillo con un script. Se trataría de un deployer para Jboss 4 (antiguo, pero todavía quedan, creedme):

#!/usr/bin/env python
#
# Title         :jboss4deployer_example.py
# Author        :Julio Sanz
# Website       :www.elarraydejota.com
# Email         :juliojosesb@gmail.com
# Date          :04/10/2015
# Tested in     :Debian Wheezy/Jessie, RHEL/CentOS 7/6
# Description   :Example script to deploy apps in Jboss 4 AS using Python Fabric library
# Dependencies  :fabric
# Usage         :fab -f jboss4deployer_example.py -R [role] [deploy_function]
# License       :GPLv3
#
################################################################################

# --------------------
# MODULES LOAD
# --------------------

from fabric.api import env, settings
from fabric.operations import run, put
import time

env.warn_only = 'true'
env.password = 'PASSWORD'

# -------------------
# ROLES DEFINITION
# -------------------

env.roledefs = {
'test': ['localhost'],
'app1': ['jbossuser@192.168.2.101'],
'app2': ['jbossuser@192.168.2.102'],
'app3': ['jbossuser@192.168.2.103']
} 

# ------------------------
# FUNCTIONS
# ------------------------

# Deployer app1
def deploy_app1():
	run('rm -rf /opt/jboss-4.2.3.GA/server/default/deploy/app1.war')
	time.sleep(5)
	run('/opt/jboss-4.2.3.GA/bin/shutdown.sh -S --server=192.168.2.101')
	time.sleep(20)
	put('C:\\Deployments\\app1.war', '/opt/jboss/jboss-4.2.2.GA/server/default/deploy')
	run('nohup /opt/jboss-4.2.3.GA/bin/run.sh -c default -b 192.168.2.101')

# Deployer app2
def deploy_app2():
	run('rm -rf /opt/jboss-4.2.3.GA/server/default/deploy/app2.war')
	time.sleep(5)
	run('/opt/jboss-4.2.3.GA/bin/shutdown.sh -S --server=192.168.2.102')
	time.sleep(20)
	put('C:\\Deployments\\app2.war', '/opt/jboss/jboss-4.2.2.GA/server/default/deploy')
	run('nohup /opt/jboss-4.2.3.GA/bin/run.sh -c default -b 192.168.2.102')

# Deployer app3
def deploy_app3():
	run('rm -rf /opt/jboss-4.2.3.GA/server/default/deploy/app3.war')
	time.sleep(5)
	run('/opt/jboss-4.2.3.GA/bin/shutdown.sh -S --server=192.168.2.103')
	time.sleep(20)
	put('C:\\Deployments\\app3.war', '/opt/jboss/jboss-4.2.2.GA/server/default/deploy')
	run('nohup /opt/jboss-4.2.3.GA/bin/run.sh -c default -b 192.168.2.103')

Para ejecutarlo desde cmd o terminal lo lanzaríamos de la siguiente manera:

fab -f jboss4deployer_example.py -R app1 deploy_app1

Donde:

  • Con el parámetro -f le pasamos el fichero fabric a procesar.
  • Con -R el rol, seguido de la función a realizar (desplegar app1).

El script se encargaría de parar la instancia de Jboss remota, borrar la antigua app1 y hacer un upload de la nueva versión desde el directorio C:\Deployments local. Posteriormente, iniciaría de nuevo la instancia de Jboss del servidor remoto. Como vemos podemos realizar deploys para app2 y app3, sólo tenemos que cambiar los parámetros que le pasamos. La pass para el usuario jbossuser que se conecta por SSH al servidor remoto la establecemos con la variable de entorno env.password.

Como véis, su uso es muy sencillo y podemos hacer bastantes virguerías, no sólo a nivel de deployments de Jboss sino para instalar software, monitorización, etc… También tenemos otras opciones como Paramiko para tales menesteres, aunque a mí me encanta la sencillez de Fabric.