LINUX

Ejecute el comando en paralelo en múltiples hosts usando la herramienta PDSH

PDSH es una pequeña herramienta muy inteligente que le permite ejecutar el mismo comando en varios hosts a la vez y ver el resultado. Es una utilidad paralela remota y de alto rendimiento. Puede ejecutar varios comandos remotos en paralelo y utiliza una «ventana deslizante» (o fanout) de subprocesos para conservar recursos en el host original mientras permite que se agote el tiempo de espera de ciertas conexiones. En este artículo explicamos cómo instalar la herramienta pdsh y mostramos algunos ejemplos.

Cómo instalar PDSH

Instalar pdsh es muy simple, siga el paso a paso

1) Descargar la última versión de PDSH del sitio web del código de Google.

2) Extraiga y descomprima un archivo pdsh

[shaha@oc8535558703 Downloads]$ bzip2 -dc pdsh-2.26.tar.bz2 | tar xvf -
pdsh-2.26/
pdsh-2.26/config.h.in
pdsh-2.26/configure.ac
pdsh-2.26/configure
pdsh-2.26/bootstrap
pdsh-2.26/scripts/
pdsh-2.26/scripts/Makefile.am

3) Ahora instale pdsh con los siguientes comandos

[shaha@oc8535558703 Downloads]$ cd pdsh-2.26
[shaha@oc8535558703 pdsh-2.26]$ ./configure --with-ssh --without-rsh
checking metadata... yes
checking build system type... x86_64-redhat-linux-gnu
checking host system type... x86_64-redhat-linux-gnu
checking target system type... x86_64-redhat-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc
[shaha@oc8535558703 pdsh-2.26]$ make
[shaha@oc8535558703 pdsh-2.26]$ make install

4) Después de que se complete el comando de instalación, verifique la versión instalada de pdsh con el siguiente comando

[shaha@oc8535558703 pdsh-2.29]$ pdsh -V
pdsh-2.26
rcmd modules: ssh,exec (default: ssh)
misc modules: (none)
[shaha@oc8535558703 pdsh-2.29]$

Nota :- Pone los binarios en /usr/local/ lo cual es bueno para fines de prueba. Para el trabajo de producción, lo pondría en /opt o algo así, solo asegúrese de que esté en su camino.

Puede notar que usé la opción –sin-rsh en el comando de configuración. De forma predeterminada, pdsh usa rsh, que no es realmente seguro, por lo que opté por excluirlo de la configuración. Para reemplazar rsh y hacer que ssh sea el valor predeterminado, simplemente agregue la siguiente línea a su archivo .bashrc:

[shaha@oc8535558703 ~]$ cat .bashrc
# .bashrc
export PDSH_RCMD_TYPE=ssh
[shaha@oc8535558703 ~]$

Asegúrese de «fuente» del archivo .bashrc (es decir, la fuente .bashrc) para establecer la variable de entorno. También puede cerrar sesión y volver a iniciar sesión. Si por alguna razón ve lo siguiente cuando intenta ejecutar pdsh,

Requisito para ejecutar el comando pdsh en varios nodos

a) Claves SSH

En esta breve serie de publicaciones de blog, echaré un vistazo a algunas herramientas muy útiles que pueden facilitarle la vida como administrador del sistema de un grupo de máquinas Linux. Puede ser un clúster de Hadoop o simplemente un conjunto simple de máquinas «normales» en las que desea ejecutar los mismos comandos y supervisión.

Para empezar, usaremos las claves ssh siempre increíbles para manejar la seguridad del clúster. Después de eso, veremos cómo ejecutar el mismo comando en varias máquinas al mismo tiempo usando PDSH.

En resumen, las claves ssh nos permiten realizar la autenticación sin contraseña de forma segura. Trabajar con claves SSH implica tomar la clave pública de un compañero y agregarla a otra máquina para permitir que el propietario de la clave privada del compañero acceda a esa máquina. Lo que haremos aquí es generar un par de claves único que se utilizará como identidad en el clúster. Así cada nodo tendrá una copia de la clave privada, para poder autenticarse ante cualquier otro nodo, el cual tendrá una copia de la clave pública (así como, a su vez, la misma clave privada).

Tenemos varias formas de implementar claves SSH. Dado que es un clúster de sandbox puro, podría usar el mismo par de claves SSH que genero para el clúster en mi máquina, por lo que el mismo par de claves pública/privada se distribuye de la siguiente manera:

Primero, necesitamos generar la clave usando ssh-keygen dominio

[shaha@oc8535558703 ]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/shaha/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/shaha/.ssh/id_rsa.
Your public key has been saved in /home/shaha/.ssh/id_rsa.pub.
The key fingerprint is:
42:eb:75:b6:67:f3:86:71:e2:30:af:62:24:15:27:1d shaha@oc8535558703.ibm.com
The key's randomart image is:
+--[ RSA 2048]----+
| .E. |
| o o |
| . + |
| . .. |
| o.S o |
| ..o.oo.o . |
| .o .=+= |
| o o+o. |
| . ... .. |
+-----------------+
[shaha@oc8535558703 ]$

Esto genera dos archivos en la carpeta .ssh: las claves privada y pública (.pub) del par:

[shaha@oc8535558703 ~]$ cd .ssh/
[shaha@oc8535558703 .ssh]$ ls -lrt
-rw-------. 1 shaha shaha 1675 Aug 4 01:03 id_rsa
-rw-r--r--. 1 shaha shaha 408 Aug 4 01:03 id_rsa.pub
[shaha@oc8535558703 .ssh]$

b) Preparando el archivo authorized_keys

Ahora prepararemos el archivo authorized_keys, que es donde se almacena la clave pública SSH de cualquier identidad a la que se le permita acceder a la máquina. Tenga en cuenta que cada usuario en una máquina tiene su propio archivo authorized_keys, en ~/.ssh/. Entonces, por ejemplo, el usuario raíz tiene el archivo en /root/.ssh/authorized_keys y cualquier clave pública que figure en ese archivo podrá conectarse al servidor como usuario raíz. Tenga en cuenta el americano [mis-]ortografía de «autorizado» – escríbalo [correctly] como «autorizado» y no obtendrá errores obvios, pero la autenticación de clave ssh tampoco funcionará.

Compartir artefactos SSH

Ahora enviaremos este conjunto de archivos SSH a la carpeta .ssh del usuario de destino en cada nodo, que en este caso es el usuario raíz. Desde una perspectiva de seguridad, probablemente sea mejor usar un usuario que no sea root para iniciar sesión y luego Sudo según sea necesario, pero estamos manteniendo las cosas simples (y menos seguras) para comenzar aquí. Así que los archivos en nuestra carpeta son:

id_rsa: la clave privada del par de claves
id_rsa.pub: la clave pública del par de claves.

Estrictamente hablando, esto no requiere distribución a todos los nodos, pero es conveniente y práctico guardarlo junto con la clave privada.

Authorized_keys: este es el archivo que examinará el demonio sshd en cada nodo para validar la clave privada proporcionada por una solicitud de conexión entrante y, por lo tanto, debe tener la clave pública de cualquier persona que tenga permiso para acceder a la máquina como este usuario.

[shaha@oc8535558703 ~]$ cat ~/.ssh/id_rsa.pub |ssh ubuntu@ec2-52-58-254-227.eu-central-1.compute.amazonaws.com 'cat >> .ssh/authorized_keys'
ubuntu@ec2-52-58-254-227.eu-central-1.compute.amazonaws.com's password:
[shaha@oc8535558703 ~]$

En este punto, deberá ingresar la contraseña del usuario objetivo, ¡pero disfrute! Esta es la última vez que deberá ingresarlo, ya que los inicios de sesión posteriores se autenticarán con las claves ssh que configuró ahora.

c) Confirmar conectividad sin contraseña

Si obtiene el siguiente error durante la conectividad, menos contraseña

[shaha@oc8535558703 .ssh]$ ssh ec2-user@ec2-52-59-121-138.eu-central-1.compute.amazonaws.com
Agent admitted failure to sign using the key.
ec2-user@ec2-52-59-121-138.eu-central-1.compute.amazonaws.com's password:

Luego ejecuta este comando

[shaha@oc8535558703 .ssh]$ export SSH_AUTH_SOCK=0
[shaha@oc8535558703 .ssh]$ ssh ec2-user@ec2-52-59-121-138.eu-central-1.compute.amazonaws.com
[shaha@oc8535558703 .ssh]$ ssh ec2-user@ec2-52-59-121-138.eu-central-1.compute.amazonaws.com

Ejemplo de comando PDSH

Primero, intentaré obtener la versión del kernel de un nodo usando su dirección IP:

[shaha@oc8535558703 ~]$ pdsh -w ec2-user@ec2-52-59-121-138.eu-central-1.compute.amazonaws.com uname -r
ec2-52-59-121-138: 4.4.11-23.53.amzn1.x86_64
[shaha@oc8535558703 ~]$

La opción -w significa que especifica los nodos que ejecutarán el comando. En este caso, especifiqué la dirección IP del nodo (ec2-52-59-121-138). Después de la lista de nodos, agrego el comando que quiero ejecutar, que en este caso es uname -r. Observe que pdsh comienza la línea de salida identificando el nombre del nodo.

1) Ejecución de comandos de un solo nodo

Para combinar los comandos que envía a cada host o a un solo host, puede usar el punto y coma del operador bash estándar;

[shaha@oc8535558703 ~]$ pdsh -w ec2-user@ec2-52-28-150-229.eu-central-1.compute.amazonaws.com uname -a;hostname ; who
ec2-52-28-150-229: Linux ip-172-31-16-42.eu-central-1.compute.internal 3.10.0-327.el7.x86_64 #1 SMP Thu Oct 29 17:29:29 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux
LinuxRedhatCluster
shaha tty1 2016-07-31 20:08 (:0)
shaha pts/0 2016-08-02 11:11 (:0.0)
shaha pts/1 2016-08-02 11:13 (:0.0)
shaha pts/2 2016-08-02 12:02 (:0.0)
shaha pts/3 2016-08-02 20:38 (:0.0)
shaha pts/4 2016-08-03 10:52 (:0.0)
shaha pts/5 2016-08-03 15:19 (:0.0)
shaha pts/6 2016-08-03 10:33 (:0.0)
shaha pts/7 2016-08-03 17:09 (:0.0)
shaha pts/8 2016-08-03 18:48 (:0.0)
shaha pts/9 2016-08-03 22:49 (:0.0)
[shaha@oc8535558703 ~]$

2) Ejecución de comandos de múltiples nodos

Una forma muy común de usar pdsh es configurar la variable de entorno WCOLL para que apunte al archivo que contiene la lista de hosts que desea usar en el comando pdsh. Por ejemplo, creé un subdirectorio PDSH donde creo un archivo de hosts que enumera los hosts que quiero usar:

[shaha@oc8535558703 ~]$ mkdir PDSH
[shaha@oc8535558703 ~]$ cd PDSH
[shaha@oc8535558703 PDSH]$ vi hosts

Insertar todos los nodos en el archivo de host

[shaha@oc8535558703 PDSH]$ more hosts
ubuntu@ec2-52-58-254-227.eu-central-1.compute.amazonaws.com
ec2-user@ec2-52-59-121-138.eu-central-1.compute.amazonaws.com
[shaha@oc8535558703 PDSH]$

Yo uso sólo dos nodos: ec2-52-58-254-227.eu-central-1.compute.amazonaws.com y ec2-52-59-121-138.eu-central-1.compute.amazonaws.com . El primero es mi sistema de prueba (como un nodo maestro de clúster) y el segundo es mi nodo de cómputo de prueba. Puede colocar hosts en el archivo como lo haría en la línea de comandos, separados por comas. Asegúrese de no poner una línea vacía al final del archivo porque pdsh intentará conectarse a él. Puede poner la variable de entorno WCOLL en su archivo .bashrc:

export WCOLL=/home/shaha/PDSH/hosts

Como antes, puede obtener su archivo .bashrc o cerrar sesión y volver a iniciar sesión.

3) Especificación de la ejecución del comando Hosts

No enumeraré todas las otras formas de especificar una lista de nodos. La forma más fácil de especificar nodos en la línea de comando es usar la opción -w:

[shaha@oc8535558703 ~]$ pdsh -w ec2-user@ec2-52-59-121-138.eu-central-1.compute.amazonaws.com,ubuntu@ec2-52-58-254-227.eu-central-1.compute.amazonaws.com uname -r
ec2-52-59-121-138: 4.4.11-23.53.amzn1.x86_64
ec2-52-58-254-227: 3.13.0-92-generic
[shaha@oc8535558703 ~]$

En este caso, especificamos los nombres de los nodos separados por comas. También puede utilizar una variedad de hosts de la siguiente manera:

[shaha@oc8535558703 PDSH]$ pdsh -w ^hosts uptime
ubuntu@ec2-52-58-254-227: 10:00:52 up 2 days, 16:48, 0 users, load average: 0.05, 0.04, 0.05
ec2-user@ec2-52-59-121-138: 10:00:50 up 2 days, 16:51, 0 users, load average: 0.00, 0.01, 0.05
[shaha@oc8535558703 PDSH]$

4) Comandos pdsh más útiles

Ahora puedo pasar a la segunda marcha y probar algunos trucos pdsh más sofisticados. Primero, quiero ejecutar un comando más complicado en todos los nodos. Note que puse todo el comando entre comillas. Esto significa que todo el comando se ejecuta en cada nodo, incluido el primero (cat /proc/cpuinfo) y el segundo (grep bogomips, model, cpu).

[shaha@oc8535558703 PDSH]$ pdsh 'cat /proc/cpuinfo' | egrep 'bogomips|model|cpu'
ubuntu@ec2-52-58-254-227: cpu family : 6
ubuntu@ec2-52-58-254-227: model : 63
ubuntu@ec2-52-58-254-227: model name : Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
ubuntu@ec2-52-58-254-227: cpu MHz : 2400.070
ubuntu@ec2-52-58-254-227: cpu cores : 1
ubuntu@ec2-52-58-254-227: cpuid level : 13
ubuntu@ec2-52-58-254-227: bogomips : 4800.14
ec2-user@ec2-52-59-121-138: cpu family : 6
ec2-user@ec2-52-59-121-138: model : 62
ec2-user@ec2-52-59-121-138: model name : Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
ec2-user@ec2-52-59-121-138: cpu MHz : 2500.036
ec2-user@ec2-52-59-121-138: cpu cores : 1
ec2-user@ec2-52-59-121-138: cpuid level : 13
ec2-user@ec2-52-59-121-138: bogomips : 5000.07
[shaha@oc8535558703 PDSH]$
[shaha@oc8535558703 PDSH]$ pdsh vmstat 1 2
ec2-user@ec2-52-59-121-138: procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
ec2-user@ec2-52-59-121-138: r b swpd free buff cache si so bi bo in cs us sy id wa st
ec2-user@ec2-52-59-121-138: 2 0 0 287424 122872 529200 0 0 1 5 10 20 0 0 100 0 0
ubuntu@ec2-52-58-254-227: procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
ubuntu@ec2-52-58-254-227: r b swpd free buff cache si so bi bo in cs us sy id wa st
ubuntu@ec2-52-58-254-227: 1 0 0 262924 153712 505960 0 0 1 5 13 19 0 0 100 0 0
ec2-user@ec2-52-59-121-138: 0 0 0 287504 122872 529232 0 0 0 0 34 74 0 0 100 0 0
ubuntu@ec2-52-58-254-227: 0 0 0 262924 153712 505992 0 0 0 0 18 20 0 0 100 0 0
[shaha@oc8535558703 PDSH]$
[shaha@oc8535558703 ~]$ pdsh -w ubuntu@ec2-52-59-121-138-node0[1-4] "date;sleep 5;date"
ec2-52-59-121-138-node01: Sat Nov 30 20:57:06 GMT 2016
ec2-52-59-121-138-node03: Sat Nov 30 20:57:06 GMT 2016
ec2-52-59-121-138-node04: Sat Nov 30 20:57:06 GMT 2016
ec2-52-59-121-138-node02: Sat Nov 30 20:57:06 GMT 2016
ec2-52-59-121-138-node01: Sat Nov 30 20:57:11 GMT 2016
ec2-52-59-121-138-node03: Sat Nov 30 20:57:11 GMT 2016
ec2-52-59-121-138-node04: Sat Nov 30 20:57:11 GMT 2016
ec2-52-59-121-138-node02: Sat Nov 30 20:57:11 GMT 2016

Tenga en cuenta que el uso de comillas para incluir toda la cadena de comandos. Sin ellos, el intérprete de bash se hará cargo ; como delimitador de comando local e intente ejecutar los siguientes comandos localmente:

[shaha@oc8535558703 ~]$ pdsh -w ubuntu@ec2-52-59-121-138-node0[1-4] date;sleep 5;date
ec2-52-59-121-138-node03: Sat Aug 30 20:57:53 GMT 2016
ec2-52-59-121-138-node04: Sat Aug 30 20:57:53 GMT 2016
ec2-52-59-121-138-node02: Sat Aug 30 20:57:53 GMT 2016
ec2-52-59-121-138-node01: Sat Aug 30 20:57:53 GMT 2016
Sat 30 Aug 2016 20:58:00 GMT

5) Tubos y redireccionamientos de archivos

De manera similar a la combinación de comandos anterior, puede canalizar la salida de los comandos y debe usar comillas para encerrar la cadena de comando completa.

[shaha@oc8535558703 ~]$ pdsh -w root@ec2-52-59-121-138-node[01-4] "chkconfig|grep collectl"
ec2-52-59-121-138-node03: collectl 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ec2-52-59-121-138-node01: collectl 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ec2-52-59-121-138-node04: collectl 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ec2-52-59-121-138-node02: collectl 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Conclusión

Incluso los administradores experimentados utilizan herramientas de shell paralelas para comprender los estados de sus sistemas. Estas herramientas son fáciles de programar para que pueda almacenar los datos en un archivo plano o una base de datos.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar