Scripting con Jboss CLI

por | enero 17, 2016

Jboss AS7/EAP 6 introdujo una interesante funcionalidad con una renovada línea de comandos conocida como Jboss CLI, ofreciendo amplias opciones para la administración y monitorización de los distintos componentes, módulos y subsistemas.

Es posible utilizar la CLI de una forma interactiva, es decir, conectándonos explícitamente a ella desde nuestra terminal, navegando por los subsistemas y realizando diversas tareas de administración de forma manual. Sin embargo, también existe la posibilidad de escribir scripts y lanzarlos contra la CLI para que se ejecuten automáticamente conjuntos de órdenes batch. Existen dos formas de hacerlo:

  • Modo batch: algo limitado, ya que en un principio no podemos hacer sustitución de variables en el script, por lo que éstos se vuelven poco portables.
  • Wrapper con Here Document: de esta manera, por ejemplo desde un script en bash podemos lanzar órdenes contra la CLI de Jboss, ofreciendo además la posibilidad de utilizar variables o incluso de realizar interacción. Donde digo script en bash también servirían otros lenguajes que permitieran pasar el fragmento de código a la CLI de Jboss.

Modo script batch

De esta manera indicamos a Jboss CLI qué comandos lanzar como un script batch, sin posibilidad de interacción por nuestra parte. Por ejemplo, para añadir un datasource escribiríamos en un fichero script.cli lo siguiente:

connect 127.0.0.1:9999 
batch
:take-snapshot()
/subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.mysql)
data-source add --jndi-name=java:/jboss/MySQLDS --name=MySQLPool \
--connection-url=jdbc:mysql://localhost:3306/as7development \
--driver-name=mysql --user-name=jboss --password=jboss
:reload
run-batch

Para lanzarlo posteriormente desde la CLI de Jboss:

$JBOSS_HOME/bin/jboss-cli.sh --file=script.cli

El problema que le veo a este método es que tendremos que modificar a mano cualquier parámetro que queramos cambiar, tocando directamente en las órdenes batch que le pasamos a la CLI. Tiene por tanto poca portabilidad.

Here Document para redireccionar código a Jboss CLI

Este método nos ofrece más posibilidades y portabilidad. Básicamente generaremos código desde nuestro script en bash que le pasaremos posteriormente a la CLI de Jboss con Here Document. El ejemplo anterior podría quedar de la siguiente manera:

#!/bin/sh
#-----------------------
# VARIABLES
#-----------------------

JBOSS_HOME="/opt/jboss/jboss-as-7.1.2"
module_name="com.mysql"
driver_name="mysql"
ds_jndi_name="MySQLDS"
pool_name="MySQLPool"
connection_url="jdbc:mysql://192.168.2.136:3306/devdatabase"
user_name="user"
password="password"

#-----------------------
# MAIN
#-----------------------

$JBOSS_HOME/bin/jboss-cli.sh --connect --controller=127.0.0.1:9999 <<EOF
batch
:take-snapshot()
/subsystem=datasources/jdbc-driver="$driver-name":add(driver-name="$driver_name",driver-module-name="$module_name")
data-source add --jndi-name=java:/jboss/"$ds_jndi_name" --name="$pool_name" \
--connection-url="$connection_url"--driver-name="$driver_name" --user-name="$user" --password="$password"
:reload
run-batch
exit
EOF

Con esto ganamos mucha flexibilidad. Por ejemplo en vez de especificar las variables estáticamente al principio del script, se podrían leer de forma interactiva. De esta manera, el script nos facilitaría la configuración de datasources y sería fácilmente portable para más de un uso:

echo -n "Especifica nombre del pool del datasource => "
read pool_name

echo -n "Especifica nombre del recurso JNDI => "
read ds_jndi_name
...