Cómo ejecutar comandos en varios hosts Linux mediante PSSH

Estoy seguro de que ha escuchado que todos los niños geniales están jugando con la automatización de la orquestación en estos días. ¿Pero sabes porqué? Bueno, primero, los recursos que consumen las cargas de trabajo de microservicios modernos se están volviendo mucho más complejos y se implementan en muchas más instancias que nunca. Y en segundo lugar, cada vez más de esos recursos son virtuales en lugar de físicos, por lo que muchos de ellos solo existirán durante minutos o incluso segundos.

Todo lo cual significa que incluso si quisiera iniciar sesión en cada uno de sus muchos servidores, simplemente no tendría sentido. En la mayoría de los casos, de hecho, ni siquiera sería posible. En cambio, ejecutará muchos scripts inteligentes. Y las herramientas que usa para ejecutar ese tipo de scripts generalmente se llaman orquestadores.

Estoy seguro de que se ha encontrado con al menos uno o dos miembros del club de orquestación. Además de Ansible, están Terraform, Chef, Puppet y otros. Pero también hay herramientas de nivel inferior que funcionan como complementos para las herramientas centrales de Linux como SSH. Aunque, viendo cómo se ejecutará de forma nativa en Windows y, por supuesto, macOS, no estoy seguro de que sea correcto llamar a SSH una herramienta "Linux".

Uno de esos complementos SSH es un conjunto de herramientas llamado pssh, que significa Parallel SSH. Eso es lo que vamos a aprender en este artículo, que está extraído de mi nuevo curso de Pluralsight, Optimización del sistema Linux.

Por ahora, sin embargo, les voy a contar un poco sobre el laboratorio que estoy usando para que puedan reproducirlo más fácilmente y seguirlo en casa. Tengo tres contenedores Ubuntu LXD en ejecución. La base para todas nuestras operaciones será la que tenga una dirección IP de 10.0.3.140, mientras que los dos nodos de host que aprovisionaremos de forma remota usarán 10.0.3.93 y 10.0.3.43.

Todo lo que haremos asume que tenemos acceso SSH sin contraseña desde mi contenedor base a cada uno de los dos nodos. Si no está seguro de cómo hacerlo, puede ver el módulo SSH de mi curso Protocol Deep Dive: SSH y Telnet en Pluralsight. Si tiene prisa, este tutorial de Red Hat lo llevará al mismo lugar.

Instalación pssh en Ubuntu es simple y rápido: sudo apt install pssh. No se vuelve más difícil en CentOS.

Creé un archivo de inventario de host simple llamado sshhosts.txt que no contiene nada más que las direcciones IP de mis dos nodos:

$ less sshhosts.txt 10.0.3.93 10.0.3.43 

Ahora voy a ejecutar el comando pssh paralelo-ssh para ejecutar un solo comando en mis hosts.

$ parallel-ssh -i -h sshhosts.txt df -ht ext4 

-i le dice al programa que se ejecute como interactivo; de lo contrario, no se nos mostrará ningún resultado de comando. -h apunta al archivo de hosts que llamé sshhosts.txt. Y el comando en sí será la antigua utilidad de Unix df. Eso devolverá una lista de unidades conectadas al sistema junto con sus puntos de montaje e información de uso. La -h aquí mostrará el espacio en disco en unidades legibles por humanos y la t restringirá el acceso solo a unidades formateadas como ext4.

¿Por qué me preocupo por ese asunto de ext4? Porque Ubuntu usa el administrador de paquetes instantáneos y cada complemento crea su propio dispositivo virtual. ¿Y qué? Bueno, no quiero tener que revisar una docena de dispositivos virtuales que reportan 0 espacio libre solo para llegar a las unidades reales que reportan el uso real.

$ parallel-ssh -i -h sshhosts.txt df -ht ext4 [1] 22:02:00 [SUCCESS] 10.0.3.43 Filesystem Size Used Avail Use% Mounted on /dev/sda2 457G 131G 304G 30% / [2] 22:02:00 [SUCCESS] 10.0.3.93 Filesystem Size Used Avail Use% Mounted on /dev/sda2 457G 131G 304G 30% / 

¡Y ahí tienes! Información de espacio en disco completo sobre mis dos nodos. Estoy seguro de que notó que la información es idéntica. Esto se debe a que ambos son contenedores que se ejecutan en mi estación de trabajo, por lo que, hasta donde ellos saben, ambos tienen acceso completo a mi propia unidad.

Para mi próximo truco, recopilaré los archivos / etc / group de cada uno de mis nodos. Este es el tipo de operación que podría ser útil para monitorear rápidamente el estado de seguridad de sus nodos. Puede agregar un script que analice los datos entrantes y le avise si hay anomalías.

Antes de comenzar, crearé un directorio localmente llamado archivos de host. Luego usaré el parallel-slurpcomando, cuyo nombre describe maravillosamente su función. Nuevamente, -h apunta al archivo hosts. Las -Lestablece el directorio de archivos de acogida como la ubicación de destino para escribir los datos que vamos a generar, /etc/groupes el archivo remoto queremos sorber, y groupes el nombre que desee asignar los datos a nivel local.

mkdir host-files parallel-slurp -h sshhosts.txt -L host-files/ /etc/group group 

Cuando haya terminado, su directorio de archivos de host contendrá subdirectorios con el nombre de la dirección IP de cada uno de sus nodos. Como puede ver, hay un archivo llamado "grupo" que contiene los datos de / etc / group de cada nodo.

$ tree host-files/ host-files/ ├── 10.0.3.43 │   └── group └── 10.0.3.93 └── group 

¿Pssh viene con otras golosinas? Sip. Y correr aproposte da la lista completa.

$ apropos parallel parallel-nuke (1) - parallel process kill program parallel-rsync (1) - parallel process kill program parallel-scp (1) - parallel process kill program parallel-slurp (1) - parallel process kill program parallel-ssh (1) - parallel ssh program 

Este artículo se basa en el contenido de mi curso de Pluralsight, "Optimización del sistema Linux". Hay mucha más bondad de administración en forma de libros, cursos y artículos disponibles en bootstrap-it.com.