LINUX

Ejecute Command Parallel on Multiple Hosts usando la herramienta PDSH

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

Cómo instalar PDSH

Instalar pdsh es realmente simple, siga los pasos de soplado

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

2) Extraer y descomprimir 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 completar el comando make install, 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 :- Coloca los binarios en / usr / local /, lo cual está bien para propósitos 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 utilicé la opción –without-rsh en el comando de configuración. Por defecto, pdsh usa rsh, que no es realmente seguro, así que elijo excluirlo de la configuración. Para anular rsh y hacer que ssh sea el 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» su archivo .bashrc (es decir, fuente .bashrc) para establecer la variable de entorno. También puede cerrar la sesión y volver a iniciarla. Si, por alguna razón, ve lo siguiente cuando intenta ejecutar pdsh,

Requisito para ejecutar el comando pdsh en múltiples nodos

a) claves SSH

En esta breve serie de publicaciones de blog, voy a echar un vistazo a algunas herramientas muy útiles que pueden facilitarle la vida como administrador de sistemas 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 siempre increíbles claves ssh para administrar la seguridad en el clúster. Después de eso, veremos cómo ejecutar el mismo comando en varias máquinas al mismo tiempo usando PDSH.

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

Tenemos varias formas de implementar las claves SSH. Debido a que es un clúster puramente de espacio aislado, también 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 así:

Primero, necesitamos generar la clave usando ssh-keygen mando

[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 en la carpeta .ssh dos archivos: las claves pública y privada (.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) Preparar el archivo Authorized_keys

Ahora prepararemos el archivo Authorized_keys que es donde se almacena la clave SSH pública de cualquier identidad autorizada para acceder a la máquina. Tenga en cuenta que cada usuario de una máquina tiene su propio archivo de claves_autorizadas, en ~ / .ssh /. Entonces, por ejemplo, el usuario root tiene el archivo en /root/.ssh/authorized_keys y cualquier clave pública listada en ese archivo podrá conectarse al servidor como usuario root. Sea consciente del americano [mis-]ortografía de «autorizado» – deletree [correctly] como «autorizado» y no obtendrá ningún error obvio, pero el inicio de sesión con la clave ssh tampoco funcionará.

Distribuir los artefactos SSH

Ahora vamos a enviar 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 el punto de vista de la 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 empezar aquí. Entonces 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 necesita distribuirse a todos los nodos, pero es convencional y práctico mantenerlo junto con la clave privada.

Authorized_keys: este es el archivo que el demonio sshd en cada nodo mirará para validar la clave privada ofrecida por una solicitud de inicio de sesión entrante, por lo que necesita mantener la clave pública de cualquiera 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 de destino, ¡pero regocíjese! Esta es la última vez que deberá ingresarlo, ya que los inicios de sesión posteriores se autenticarán utilizando las claves ssh que ahora está configurando.

c) Confirmar contraseña menos conectividad

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

[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:

Entonces 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

Para comenzar, 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 estoy especificando 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 es uname -r en este caso. Observe que pdsh inicia la línea de salida identificando el nombre del nodo.

1) Ejecución de comandos de nodo único

Para combinar los comandos que envía a cada host o host individual, 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 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 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]$

Solo estoy usando 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 principal de clúster) y el segundo es mi nodo de cálculo 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 en blanco 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 puede cerrar la sesión y volver a iniciarla.

3) Especificación de la ejecución de comandos de hosts

No enumeraré todas las otras formas de especificar una lista de nodos. La forma más sencilla es especificar los 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, especifiqué 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 poner la segunda marcha y probar algunos trucos de pdsh más sofisticados. Primero, quiero ejecutar un comando más complicado en todos los nodos. Observe que pongo todo el comando entre comillas. Esto significa que todo el comando se ejecuta en cada nodo, incluida la primera (cat / proc / cpuinfo) y la segunda (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 el uso de las comillas para encerrar toda la cadena de comandos. Sin ellos, el intérprete de bash tomará el ; como delimitador de los comandos locales 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) Redirecciones de archivos y tuberías

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

[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 se pueden programar fácilmente, por lo que puede almacenar los datos en un archivo plano o en 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