Despliegues remotos en Jboss/Wildfly via API HTTP Rest con librería Requests(Python)

por | abril 2, 2018

Desde la versión comunitaria Jboss AS 7 (en adelante Wildfly) y EAP 6, se pueden realizar tareas administrativas en el servidor de aplicaciones por medio de la API HTTP Rest. Para la parte que toca en este artículo, los despliegues son una de las operaciones que podemos realizar mediante esta API.

Para este artículo vamos a tener en cuenta las siguientes variables:

  • Usuario admin
  • Password admin01
  • URL de la consola web http://192.168.1.132:9990
  • Paquete a desplegar localizado en /repositorio/paquetes/example.war

Veremos un primer ejemplo con curl que es la forma más tradicional de utilizar la API y después su equivalente con Requests, una librería de Python.

Utilizando curl

Tradicionalmente la forma de interactuar con la nueva API es mediante curl, realizando una petición HTTP POST con los parámetros que veremos a continuación. Hacer un despliegue es tan sencillo como añadir el contenido -hash- del paquete y después proceder a desplegar y habilitar el paquete:

  1. Añadimos contenido (add-content)
    curl -F "file=@/repositorio/paquetes/example.war" --digest http://admin:admin01@http://192.168.1.132:9990/management/add-content
    

    Esto producirá una salida con un BYTES_VALUE en concreto, que utilizaremos en la siguiente operación.

  2. Desplegamos y habilitamos mandando la orden de despliegue en un json embebido con la opción -d
    curl -S -H "Content-Type: application/json" -d '{"content":[{"hash": {"BYTES_VALUE" : "b/p5mJF0Lxzr0trGdbhUF2gvNM4="}}], "address": [{"deployment":"/repositorio/paquetes/example.war"}], "operation":"add", "enabled":"true"}' --digest http://admin:admin01@192.168.1.132:9990/management
    

Utilizando librería Requests (Python)

Resulta que también podemos trabajar con la librería Requests de Python para realizar despliegues remotos mediante la API Rest de Jboss. Es muy sencillo, y además contamos con la ventaja de que al ser multiplataforma, podemos montarnos nuestros scripts en local si nuestra estación de trabajo es un Windows o MacOS.

¿Cómo es posible trabajar con requests como lo hacemos con curl? Básicamente porque podemos hacer la misma petición HTTP POST con Request que con curl, incluyendo autenticación digest y todos los demás parámetros que necesitamos mandarle a la API.

  1. Añadimos contenido:
    import requests
    import json
    from requests.auth import HTTPDigestAuth
    
    files = {
        'file': ("/repositorio/paquetes/example.war", open("/repositorio/paquetes/example.war", 'rb')),
    }
    
    r = requests.post('http://192.168.1.132:9990/management/add-content', files=files, auth=HTTPDigestAuth(admin, admin01))
    
    json_data = json.loads(r.text)
    v_bytes_value = json_data['result']['BYTES_VALUE']
    
    # Muestra el valor de BYTES_VALUE
    print (v_bytes_value)
    

    Dicho snippet produce el BYTES_VALUE que posteriormente utilizaremos en la segunda fase de despliegue.

  2. Desplegamos y habilitamos. El json que antes cargábamos en la petición HTTP con curl también podemos embeberlo fácilmente como vemos:
    headers = {
        'Content-Type': 'application/json', 'Accept': 'text/plain'
    }
    
    data = '{"content":[{"hash": {"BYTES_VALUE" : "b/p5mJF0Lxzr0trGdbhUF2gvNM4="}}], \
    "address": [{"deployment":"example.war"}], \"operation":"add", "enabled":"true"}' 
           
    response = requests.post('http://192.168.1.132:9990/management', auth=HTTPDigestAuth(admin, admin01), headers=headers, data=(data))
    
    # Vemos la respuesta de Jboss
    print response.text
    

Puedes ir cargando en la consola de Python estas líneas de código o bien crear un script y lanzarlo del tirón, sustituyendo las variables en cada caso por las que correspondan en tu caso.

Como vemos no es nada complicado realizar un despliegue con la librería Requests. Podemos hacer nuestros scripts ad-hoc para paquetes en concreto u otros más genéricos partiendo de esta base. Por mi parte he subido el repositorio jota-jboss-deployer donde de momento tengo un script para realizar despliegues en instancias standalone. Este script acepta como argumentos los parámetros necesarios para poder desplegar en nodos remotos de Jboss.