#4sysadmins

Inicio » GNU/Linux » Distributed Shell (DSH): Ejecutar comando Linux en múltiples máquinas

Distributed Shell (DSH): Ejecutar comando Linux en múltiples máquinas

Últimas Entradas

Follow #4sysadmins on WordPress.com

Distributed Shell es un pequeño programa fácilmente instalabe desde los repositorios de nuestra distribución, que nos permitirá ejecutar un comando en varias máquinas de una sola vez.

Instalacion

Debian

Para instalar DSH en nuestra distribución Debian tan solo tendremos que ejecutar el comando apt-get para descargarlo e instalarlo desde los repositorios oficiales:

$ sudo apt-get install dsh

RedHat

Si tenemos una distribución derivada de RedHat tendremos que instalar y descargar algunas librerías y además compilarlas:

Descargar, compilar e Instalar “libdshconfig”

$ cd ~; mkdir dsh
$ wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.10.cvs.1.tar.gz
$ tar xzf libdshconfig*.tar.gz
$ cd libdshconfig-*
$ ./configure
$ make
$ make install

Descargar, compilar e instalar dsh

$ wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.22.0.tar.gz
$ tar xfz dsh-0.22.0.tar.gz; cd dsh-*
$ ./configure
$ make
$ make install

 

Configuración

Los archivos de configuración son:

  • Debian: /etc/dsh/dsh.conf
  • RedHat: /usr/local/etc/dsh.conf

En ellos deberemos de modificar el parámetro remoteshell:

remoteshell = ssh

Nota: Podemos encontrar mas opciones en su pagina man:

$ man dsh

Lista de hosts

Después de cambiar el modo de conexión a ssh, vamos a crear una lista de hosts a los que enviaremos los comandos simultáneamente:

  • Debian: /etc/dsh/machines.list
  • RedHat: /usr/local/etc/machines.list

Nota: Para sistemas RedHat no existe el archivo por lo que deberemos de crearlos nosotros

Cada línea del archivo será una IP,HOSTNAME o FQDN. También podemos definir el nombre de usuario delante del host separado por @. Veremos esto a continuación.

Importante: Para poder ejecutar comandos sin passwd vía ssh, todos los servidores remotos deberán de tener en el directorio ~/.ssh del usuario con el que conectamos a dicho servidor la key pública de nuestro host. Esto ya lo vimos en otra entrada, no obstante, valdrá con hacer lo siguiente:

En nuestro host:

$ ssh-keygen -q -t rsa -f ~/.ssh/id_rsa -C '' -N ''
$ ssh-copy-id usuario_remoto@servidor_remoto
The authenticity of host 'servidor_remoto (10.122.13.18)' can't be established.
ECDSA key fingerprint is fd:f5:aa:bb:1d:1b:b7:1c:d3:re:c6:16:78:3c:92:16.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
usuario_remoto@servidor_remoto password: <la pass del ususario remoto>
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'usuario_remoto@servidor_remoto'"
and check to make sure that only the key(s) you wanted were added.

Ahora probamos que podemos acceder sin passwd:

$ ssh usuario_remoto@servidor_remoto

Nota: Hacer esto para todos los servidores que vayamos a indicar en el archivo “machines.list

 

Ejecutar comando

Debemos de saber que para ejecutar un comando en un servidor remoto desde nuestro equipo anfitrión debemos de indicar el usuario con el que conectamos y el equipo al que lo hacemos, tal que así:

$ ssh usuario_remoto@equipo_remoto <comando>

Algo importante a tener en cuenta es que dsh utiliza nuestro usuario local (con el que vamos a lanzar el comando desde nuestra máquina al resto de servidores) para ejecutar el comando en el servidor remoto, por lo que solo le añade nuestro usuario a @equipo_remoto_en_la_lista. Esto, a menos que en el servidor remoto exista ese mismo usuario y con la misma password provocará que el servidor remoto nos pida la clave.

Para solucionar esto y poder ejecutar el comando en el servidor remoto con un usuario que en él exista, deberemos de añadir los usuarios de cada servidor en el archivo machine.list.

Importante: Cuando copiamos la key pública en el servidor remoto, deberemos entonces de hacerlo con los usuarios que indicamos en el archivo!!!

Nuevo machine.list:

usuario_remoto@servidor_remoto
usuario_remoto@servidor_remoto2
otro_user_remoto@servidor_remoto3
...

Y ahora ya entonces, ejecutamos el comando desde el anfitrión:

$ dsh -aM -c whoami

Opciones

-a: Indica que el comando whoami sea ejecutado en todas las máquinas encontradas en el archivo machine.list

-M: Imprime por pantalla (antes del resultado de la ejecución del comando) el nombre de la máquina o el usuario@nombre_máquina (dependiendo de como lo hayamos escrito en el archivo machine.list).

-c: ejecuta el comando whoami de forma simultánea.

Otras opciones

Podemos crear archivos dentro de /etc/dsh/group/ para separar unas máquinas de otras, por ejemplo si tenemos diferentes entornos (producción y desarrollo) o si un grupo de máquina tiene un usuario en común y otras otro usuario, etc…

Por ejemplo vamos a crear dos grupos (producción y desarrollo):

$ sudo vi /etc/dsh/group/pro
user_pro@maquina-pro1
user_pro@maquina-pro2
$ sudo vi /etc/dsh/group/dev
user_dev@maquina-dev01
user_dev@maquina-dev02
user_backup@maquina-dev03

Y ahora con la opción -g <grupo> indicaremos que el comando solo sea ejecutado en un grupo concreto:

$ dsh -g pro hostname

En vez de hacer lo anterior, si no tenemos permisos de root, podemos crear esos mismos archivos (dev y pro) en nuestro home y llamarlos con la opción -f:

$ dsh -f /home/usuario/dev whoami

O indicar directamente los nombres de máquina o usuario@maquina desde la línea de comandos:

$ dsh -m user_dev@maquina-dev02,user_pro@maquina-pro1 whoami

Si no queremos ejecutar el comando de forma concurrente (-c) podemos indicar con -w que se ejecute el comando en una máquina y hasta que este no termine no se ejecute el comando en la siguiente máquina

La opción opuesta a -M (mostrar nombre máquinas antes del resultado de la ejecución del comando) es -H

 

 


2 comentarios

  1. nebul4ck dice:

    Hola fracielarevalo, no conozco Canaima pero los comando sudo y apt-get son esenciales para tomar privilegios de root y para instalar paquetes. Apt-get es el sistema de paquetería Debian, si Canaima está basado en Debian debería de soportar perfectamente apt.

    Me gusta

  2. buenos dias yo tengo instalado canaima 4.0 basado en debian pero esos comados no funconan ni el sudo apt-get y supuestamente no ruedan en debian

    Me gusta

Deja un comentario, Gracias!

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: