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 😉