Simplificando los despliegues en Jboss con Ansible

por | julio 11, 2018

Existen diversas maneras de organizar los despliegues en Jboss como habíamos visto: fabric, interactuando con la API REST o con scripts personalizados que nos montemos al uso. Ansible dispone de un módulo para Jboss que podemos añadir a la lista de métodos.

Su uso es muy sencillo, aunque la limitación que tiene al menos de momento es que no permite desplegar en dominios, por lo que sólo nos servirá para instancias standalone.

En el entorno dispongo de:

  • Nodo central (mi máquina) desde donde voy a lanzar el despliegue. Tengo una relación de confianza con clave pública con el nodo remoto para poder conectar por SSH sin contraseña.
  • Nodo remoto con IP 192.168.1.154 donde está la instancia de Jboss EAP 7.1 en la que se realizará el despliegue. Esta instancia se ejecuta con el usuario jota y tiene el deployment-scanner habilitado (necesario para que funcione el despliegue con Ansible)

Lanzando el despliegue con ansible

En mi nodo central dejo los paquetes compilados en /repository/apps/. Para este caso en concreto el paquete a desplegar es /repository/apps/example.war

A su vez en mi directorio de trabajo tengo un fichero hosts donde especifico por grupos los nodos hacia los que lanzo operaciones con ansible:

[jota@jota-pc deploy]$ cat hosts 
[jboss]
192.168.1.154

[apache]
192.168.1.153

Únicamente con esto ya puedo comenzar a realizar el despliegue.

En primer lugar copio el paquete example.war en la máquina remota en /tmp:

ansible -i hosts jboss -m copy -a "src=/repository/apps/example.war dest=/tmp" -u jota

Ejemplo:

[jota@jota-pc deploy]$ ansible -i hosts jboss -m copy -a "src=/repository/apps/example.war dest=/tmp" -u jota
192.168.1.154 | SUCCESS => {
    "changed": true, 
    "checksum": "f57e512913caf8a63b262ed876975f3cbc4daa81", 
    "dest": "/tmp/example.war", 
    "gid": 1000, 
    "group": "jota", 
    "md5sum": "e51ff3fb235116cda90484a01ac341e6", 
    "mode": "0664", 
    "owner": "jota", 
    "size": 2818, 
    "src": "/home/jota/.ansible/tmp/ansible-tmp-1531251510.1-48181104353543/source", 
    "state": "file", 
    "uid": 1000
}

Realizo el despliegue en la máquina remota. En este caso la ruta del directorio deployments es /middleware/jboss-eap-7.1/node1/deployments

ansible -i hosts jboss -m jboss -a "deploy_path=/middleware/jboss-eap-7.1/node1/deployments \
deployment=example.war src=/tmp/example.war state=present" -u jota

Ejemplo:

[jota@jota-pc deploy]$ ansible -i hosts jboss -m jboss -a "deploy_path=/middleware/jboss-eap-7.1/node1/deployments \
deployment=example.war src=/tmp/example.war state=present" -u jota
192.168.1.154 | SUCCESS => {
    "changed": true
}

Comprobando los logs de la máquina remota veo que el paquete se ha desplegado correctamente:

jota@mid-dockers:/middleware/jboss-eap-7.1/node1/log$ tail -f server.log 
2018-07-06 04:17:41,009 INFO  [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: Resuming server
2018-07-06 04:17:41,012 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
2018-07-06 04:17:41,012 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
2018-07-06 04:17:41,012 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: JBoss EAP 7.1.0.GA (WildFly Core 3.0.10.Final-redhat-1) started in 3923ms - Started 292 of 553 services (347 services are lazy, passive or on-demand)
2018-07-06 04:52:31,269 INFO  [org.jboss.as.repository] (DeploymentScanner-threads - 2) WFLYDR0001: Content added at location /middleware/jboss-eap-7.1/node1/data/content/f5/7e512913caf8a63b262ed876975f3cbc4daa81/content
2018-07-06 04:52:31,322 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0027: Starting deployment of "example.war" (runtime-name: "example.war")
2018-07-06 04:52:31,998 INFO  [org.infinispan.factories.GlobalComponentRegistry] (MSC service thread 1-2) ISPN000128: Infinispan version: Infinispan 'Chakra' 8.2.8.Final-redhat-1
2018-07-06 04:52:32,439 INFO  [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 62) WFLYCLINF0002: Started client-mappings cache from ejb container
2018-07-06 04:52:32,621 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 67) WFLYUT0021: Registered web context: '/example' for server 'default-server'
2018-07-06 04:52:32,686 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) WFLYSRV0010: Deployed "example.war" (runtime-name : "example.war")

Organizando los despliegues en playbooks

Para un despliegue particular podemos hacerlo de la manera anterior pero podemos organizarnos mejor -especialmente cuando comenzamos a tener bastantes despliegues distintos que realizar- con sencillos playbooks.

Cada playbook lo organizo en un directorio, en mi caso he llamado al directorio deploy-example y dentro de él tengo la siguiente estructura:

├── deploy-example.yml
├── hosts
└── roles
    └── common
        └── tasks
            └── main.yml

En el fichero deploy-example.yml:

---
- hosts: jboss
  remote_user: jota
  roles:
    - common

A su vez en el fichero main.yml tengo las dos tareas a realizar (copiar a remoto y desplegar)

---
- name: copy package to remote server
  copy: src=/repository/apps/example.war dest=/tmp

- name: deploy application
  jboss: deploy_path=/middleware/jboss-eap-7.1/node1/deployments src=/tmp/example.war deployment=example.war state=present

En el fichero de hosts lo mismo que en el caso anterior:

[jota@jota-pc deploy-example]$ cat hosts 
[jboss]
192.168.1.154

[apache]
192.168.1.153

Ahora simplemente me quedaría lanzar el playbook con:

ansible-playbook -i hosts jboss deploy-example.yml 

Por ejemplo:

[jota@jota-pc deploy]$ ansible-playbook -i hosts jboss deploy-example.yml 
 ______________
< PLAY [jboss] >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

 ________________________
< TASK [Gathering Facts] >
 ------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

ok: [192.168.1.154]
 _______________________________________________
< TASK [common : copy package to remote server] >
 -----------------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

ok: [192.168.1.154]
 ____________________________________
< TASK [common : deploy application] >
 ------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

ok: [192.168.1.154]
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

192.168.1.154              : ok=3    changed=0    unreachable=0    failed=0   

Y ya tenemos nuestra aplicación desplegada en el nodo remoto 😉