sshoogr: DSL Groovy para trabajar con servidores remotos a través de SSH

sshoogr: DSL Groovy para trabajar con servidores remotos a través de SSH
Sin comentarios Facebook Twitter Flipboard E-mail

Si trabajamos en sistemas es muy común que tengamos que hacer pequeños (y no tan pequeños) scripts para automatizar ciertas tareas, conectarnos por ssh a servidores, copiar archivos, ejecutar comandos remotos,... Existen algunas herramientas para realizar estas tareas, pero ¿qué os parecería aprovecharnos de todas las ventajas que nos proporciona Groovy para hacer esto?

Sshoogr, pronunciado como _sugar_, es una biblioteca escrita en Groovy que proporciona un DSL para trabajar con servidores remotos por SSH. Proporciona una gran flexibilidad y numerosas opciones a la vez que tenemos acceso a todo el lenguaje Groovy y a cualquier biblioteca Java que queremos utilizar.

Primeros pasos

Tenemos dos formas de empezar a utilizar _sshoorg_ a cual más sencilla.

Instalación

La forma más fácil y sencilla de instalar _sshoorg_ es utilizando SDKMAN!, del que ya hemos hablado con anterioridad, así que después de instalarlo, simplemente ejecutamos:

$ sdk install sshoogr

A continuación escribimos este pequeño script Groovy:

remoteSession('ivan:password@localhost') {
  exec 'ls -l'
}

Y lo ejecutamos:

$ sshoogr test1.groovy
>>> Connecting to localhost
> ls -l
total 124328
drwxr-xr-x  2 ivan ivan      4096 May 19 15:32 bin
...
...

<<< Disconnected from localhost

Si obteneis el error reject HostKey: localhost lo único que teneis que hacer es añadir al script anterior trustUnknownHosts = true justo antes de la closure remoteSession.

La ventaja de esa forma de instalar y utilizar _sshoorg_ es que tenemos acceso completo al DSL sin necesidad de saber cómo funciona y realmente.

¿Y sin instalarlo?: Uso como biblioteca

La otra alternativa posible es utilizarlo directamente como biblioteca Groovy. Con esta opción no podremos aprovechar completamente el DSL pero no tendremos que instalar absolutamente nada, simplemente añadir la dependencia:

@Grab('com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25')
@Grab('commons-codec:commons-codec:1.10')
import static com.aestasit.infrastructure.ssh.DefaultSsh.*

trustUnknownHosts = true
remoteSession('ivan:password@localhost') {
  exec 'ls -l'
}

En este caso vemos que el código es muy similar al anterior pero tenemos que añadir manualmente las dependencias y el import.

Sacando partido a sshoogr

Como hemos visto en ambas opciones es muy fácil y rápido empezar a utilizar _sshoorg_. Ahora vamos a ver algunas otras cosas que podemos hacer:

  • Crear archivos remotos: Una opción muy útil, por ejemplo para crear archivos de propiedades con la configuración específica de un entorno concreto:
remoteFile('/tmp/file.properties').text = "enabled=true"
  • Subir un archivo: Si en lugar de crearlo en remoto simplemente queremos subir un archivo ya existente:
  scp {
    from { localFile '/home/ivan/mi-archivo.txt' }
    into { remoteFile '/tmp/test.txt' }
  }
  • Hacer un tunel ssh: En algunas ocasiones no podemos acceder directamente a la máquina destino sino que debemos hacer _un salto intermedio_ en otra máquina. Con _sshoogr_ tenemos distintas opciones para realizar tunnelling ssh.

  • Opciones avanzadas: Por si todo lo anterior no fuera suficiente también tenemos la posibilidad de configurar muchas opciones: usuario, password y puertos por defecto, activar el modo verboso para ver más información de debug, activar o desactivar el comando que se ejecuta, la salida del comando, tiempos de espera,...

Entrevista a Andrey Adamovich, creador de sshoogr

sshoogr fue creado de la frustación de utilizar tareas Ant ssh y scp en scripts de Gradle.

Hemos aprovechado la ocasión para hacer una pequeña entrevista a Andrey Adamovich, creador de _sshoogr_:

Andrey Adamovich

¿De dónde viene el extraño nombre?

El nombre _sshoogr_ viene de una combinación de SSH y GROOvy. Estaba jugando con las letras y encontré la combinación SSH-OO-GR la más interesante de todas. SSH primero, GRoovy segundo :)

¿Por qué creaste sshoogr?

_sshoogr_ fue creado de la frustación de utilizar tareas Ant ssh y scp en scripts de Gradle. Teníamos automatizada la administración remota y el deployment a través de tareas con SSH. La opción de Ant y Gradle no parecía la mejor solución a largo plazo por la cantidad de código de script a mantener.

¿Probaste alguna otra herramienta alternativa??

Cuando cree _sshoogr_ no había muchas alternativas para ejecutar comandos shell remotos que se integrasen adecuadamente con las herramientas y los conocimientos que tenía el equipo: principalmente Java, Groovy y Gradle. Existían alternativas en Python como _Fabric_ y también estaba _Capistrano_ en el mundo de Ruby. Pero aprender esas herramientas era pedir demasiado a nuestro equipo que principalmente conocía Java. Actualmente existen algunas herramientas como _gradle-ssh_ y _overthere_ (licenciado como GPL). También _Ansible_ es bastante popular como herramienta de ejecución remota de scripts, pero no es muy _Windows-friendly_ (yo tengo una máquina con Windows).

¿Tienes planes para el futuro: añadir nuevas características,...?

Tengo muchas ideas sobre como mejorar _sshoorg_ pero el tiempo libre siempre es la mayor limitación :). Con suerte podré empezar a añadir nuevas opciones como _local-protocol_ y controlar la introducción del password de sudo durante el verano.

Bonus: Charla sobre _sshoogr_ de Andrey

Y para finalizar, si quereis conocer de primera mano _sshoogr_ y verlo en acción, os recomiendo esta charla que dio Andrey en Greach 2016:

Más información | Sshoogr

Comentarios cerrados
Inicio