Gestión de conexiones remotas con ClusterSSH en Linux

Con frecuencia los administradores de sistemas tenemos que gestionar en nuestro trabajo más de un servidor de forma remota por SSH. En ocasiones se hace tedioso tener que estar introduciendo credenciales para cada servidor con el que nos conectamos, o incluso recordar todos aquellos que tenemos que administrar. En Windows he utilizado unos cuantos gestores SSH dignos de mención, como por ejemplo mRemoteNG, MobaXterm o Bitvise. En Linux también disponemos de varios gestores como SecureCRT (de pago) o PAC Manager que cumplen perfectamente su función. Un gestor algo “distinto” llamó mi atención: ClusterSSH. Éste nos permite:

  • Gestión de conexiones SSH con cada servidor. En este sentido es prácticamente igual que un cliente SSH tradicional.
  • Gestión centralizada de clúster de servidores SSH con una única terminal. Imagina que tienes que lanzar el mismo comando (por ejemplo, una actualización apt-get update && apt-get upgrade) en 30 servidores. Con ClusterSSH puedes hacerlo fácilmente, lo que nos permite optimizar bastante tiempo.

Está disponible para Solaris, FreeBSD, GNU/Linux y Mac OSX. La instalación es muy sencilla, ya que en el caso de Linux ya lo tenemos disponible desde repositorios. Si estamos en Debian o derivadas:

aptitude install clusterssh

Y en Red Hat o derivadas:

yum install clusterssh

Configuración básica de ClusterSSH

La sintaxis básica del programa es:

cssh usuario@maquina1 usuario@maquina2 ...

De esta manera, se abrirán tantas consolas SSH como argumentos le pasemos al programa. En cada consola SSH que se abra además tendremos que introducir nuestras credenciales. Para poner un ejemplo, este es mi entorno de pruebas:

  • Anfitrión Debian con IP 192.168.2.114. Desde esta máquina conectaré por SSH con los servidores remotos.
  • Servidor ubserver1 con IP 192.168.2.130
  • Servidor ubserver2 con IP 192.168.2.131

Pues bien, para conectar desde mi amado Debian a esos dos servidores (que por cierto, son Ubuntu Server 12.04), desde terminal introduzco:

cssh jota@192.168.2.130 jota@192.168.2.131

Y obtengo lo siguiente:

Mosaico ClusterSSH

Mosaico ClusterSSH

Atención a la siguiente consola:

Terminal de cluster

Terminal de cluster

Desde ahí todo lo que introduzcamos se replicará al resto de terminales SSH abiertas. Es una especie de “terminal de cluster”. Por eso se llama clusterSSH, porque podemos administrar todos los servidores con los que tenemos conexión como un todo, como comentaba anteriormente. En este caso, si en ambos nodos tenemos la misma contraseña para ese usuario, podemos introducirla en la ventana de clusterSSH y presionar Intro. Debería hacer login en las otras dos consolas (servidores). Otro ejemplo: después de hacer login si hacemos un df -h en la consola de clusterSSH, obtenemos el resultado en ambos servidores:

Probando comando df -h con terminal de cluster

Probando comando df -h con terminal de cluster

Más comodidad configurando los servidores en ~/.ssh/config

En el fichero ~/.ssh/config podemos definir los usuarios con los que conectamos a los hosts remotos, siguiendo la siguiente sintaxis:

host [nombre personalizado de máquina]
hostname [hostname real de la máquina]
user [usuario SSH]

Por ejemplo en mi caso:

host server1 
hostName ubserver1 
user jota 

host server2 
hostname ubserver2 
user jota

En host podemos darle el nombre que queramos, pero hostname debe ser el nombre de host real para la máquina. Tendremos que indicarlo además en el fichero /etc/hosts, al que añadiremos:

192.168.2.130		ubserver1
192.168.2.131		ubserver2

De esta manera para conectar con los hosts remotos sólo tendriamos que introducir:

cssh server1 server2 

Organización completa de un verdadero clúster SSH en ~/.csshrc

Y ya llegados a este punto vamos a dar un paso más en la organización de nuestras conexiones SSH para conformar un clúster como tal. Para ello editamos el fichero ~/.csshrc, el cual deberá tener la siguiente sintaxis:

clusters = nombre_primer_clúster nombre_segundo_clúster... nombre_n_cluster
nombre_primer_clúster = máquinas del primer clúster
nombre_segundo_cluster = máquinas del segundo clúster
…

Donde:

  • clusters: el nombre de cada cluster de máquinas SSH
  • nombre_n_cluster: nombre del cluster seguido por un igual del conjunto de máquinas que conforman ese cluster.

En mi ejemplo quedaría tal que:

clusters = cluster1 
cluster1 = server1 server2

Evidentemente tendremos que tener definidos los miembros del clúster en ~/.ssh/config. Ahora para conectar con nuestro clúster de máquinas basta con hacer:

cssh cluster1 

Todo mucho más sencillo. Y esto es especialmente útil ya que podemos tener dividos los grupos de servidores según distintas funcionalidades, por ejemplo:

clusters = seguridad cuentas recursoshumanos
seguridad = server1 server2
cuentas = server3 server4 server5
recursoshumanos = server6 server7

Como véis, fácil y con condimento.