Modulado 3.0

if (bored) try { while ( ! ( this.succeed() )) } catch ( IhaveSoMuchTimeException e) {};

Administración remota de máquinas Linux, *NIX con Ruby y SSH

Hoy me gustaría mostrar la versatilidad y sencillez de Ruby a la hora de crear scripts para la gestión remota de nuestros servidores a través de ssh.

Para llevar a cabo este tipo de tareas, lo primero que necesitamos es una librería para ruby llamada net-ssh. Asumiré que disponemos de los conocimientos necesarios para instalarla, si no fuera el caso, en este enlace está toda la documentación necesaria para comprender el sistema de paquetes y librerías de Ruby conocido como Rubygems.

Bueno, para empezar, veamos lo sencillo que es crear una conexión ssh:

require "net/ssh"
Net::SSH.start(url, user, pass) do |ssh|
    shell = ssh.shell.sync
    puts shell.ruby("-v").stdout
end

Este pequeño trozo de código creará una conexión que imprimirá en pantalla la versión remota de Ruby instalada en el servidor.

Una de las maravillas de esta librería es que detecta automáticamente el sistema criptográfico de autenticación para ssh que tenemos en el sistema, así pues, si nuestros servidores usan pares de claves públicas y privadas no necesitaríamos introducir la contraseña. Para saber más acerca de este tipo de autenticación ejecutar man ssh y man ssh-keygen.

Ahora supongamos la siguiente situación, imaginemos que queremos limpiar los directorios /tmp y /opt del equipo remoto, pero no queremos crear un script en el servidor por cuestiones de seguridad. Pues bien el trozo de código sería el siguiente:

require "net/ssh"
  class HostRemoto
     def initialize(url, user = root)
        @shell = Net::SSH.start(url, user).shell.sync
     end
     def clear_dirs(*dirs)
        dirs.each { |dir| @shell.send_command("rm -rf #{dir}/*") }
     end
  end

Con esta clase definimos la creación de la sesión ssh y la función (o método) para limpiar los directorios que a continuación le pasaremos como parámetro. Fijándonos en la función clear_dirs(*dirs) podemos observar la facilidad con la que podemos pasarle parámetros a una función en Ruby, y todo gracias al ‘*’.

Para terminar, con el siguiente trozo de código ejecutaríamos la orden de limpiar los directorios:

unsafe_hosts.each do |host|
    RemoteHost.new(host).clear_dirs("/tmp", "/opt")
end

Y así de sencillo, por último solo tendríamos que crear nuestro script e incluirlo en las tareas de crontab para que se ejecutase cada X tiempo.

Lo bueno de esto, es que podríamos hacer infinidad de pequeños scripts muy útiles, como copias de seguridad remotas (si no tienes ganas de pelearte con sistemas complejos como bacula etc), búsqueda de algún fichero en concreto sin tener que ir abriendo sesiones, o incluso editarlo.

En fin, espero que con esta pequeña muestra vosotros también disfruteis de las maravillas de este elegante lenguaje de programación.

Anuncios

Una respuesta a “Administración remota de máquinas Linux, *NIX con Ruby y SSH

  1. Pingback:Bitacoras.com

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: