Cómo ejecutar comandos en múltiples máquinas Linux al mismo tiempo
Siempre estoy buscando formas de hacer mi trabajo más eficiente, así que lo último que quiero hacer es iniciar sesión en múltiples máquinas Linux y ejecutar un solo comando en cada una. Preferiría tener la capacidad de ejecutar ese comando en múltiples máquinas al mismo tiempo.
Por supuesto, hay aplicaciones para eso. Pero como esto es Linux, ¿no tendría más sentido armar tu propia solución? Por supuesto que sí. Después de todo, Linux se trata de elección, poder y flexibilidad.
Imagina que tienes varios servidores Ubuntu y quieres ejecutar sudo apt-get update y sudo apt-get upgrade en todos ellos al mismo tiempo. No tienes que iniciar sesión en cada una de esas máquinas para ejecutar esos comandos, no cuando hay scripts para manejar esa tarea por ti.
He encontrado un script de este tipo y lo he modificado de tal manera que puedes usarlo para crear múltiples scripts para hosts específicos (como servidores basados en Ubuntu o RHEL). Veamos este script y cómo hacer que funcione.
Lo que necesitarás
Para usar este script, necesitarás una máquina Linux para ejecutar el comando y servidores Linux a los que enviar comandos. Dependiendo del comando que quieras ejecutar en los servidores remotos, necesitarás un usuario con privilegios de sudo.
Eso es todo. Hagamos algo de magia.
Los diferentes tipos de buses en los dispositivos electrónicosCómo configurar SSH
Lo primero que debemos hacer es crear un archivo de configuración de SSH que defina nuestros hosts remotos. Pero hay un truco en esta configuración en particular. Vamos a definir nombres de host que comiencen con ubuntu- o rhel-, dependiendo del sistema operativo de cada uno.
En el sistema donde ejecutarás el script, crea el archivo de configuración de SSH con el comando:
nano ~/.ssh/config
Supongamos que tenemos lo siguiente:
Sistemas basados en Ubuntu en las direcciones IP 192.168.1.11 y 192.168.1.13, y una máquina basada en RHEL en la dirección IP 192.168.1.14. Nuestro archivo de configuración podría verse así:
Host rhel-db1
Hostname 192.168.1.14
Host ubuntu-invoice
Hostname 192.168.1.11
Host ubuntu-portainer
Hostname 192.168.1.13
Guarda y cierra el archivo.
Cómo entrar al programa de configuración del BIOS en tu computadoraCómo crear el script
Ahora, crearemos dos scripts, uno para servidores Ubuntu y otro para servidores RHEL. Crea el script para servidores Ubuntu con el comando:
nano ~/ubuntu-cmd
En ese archivo, pega lo siguiente:
#!/bin/bash
# Obtén la entrada del usuario como comando
[[ -z ${@} ]] && exit || CMD_EXEC="${@}"
# Obtén los hosts de ~/.ssh/config cuyos nombres comiencen con `ubuntu-`
HOSTS=$(grep -Po 'Host\s\Kubuntu-.*' "$HOME/.ssh/config")
# Verifica si el comando de entrada usa sudo
if [[ $CMD_EXEC =~ ^sudo ]]
then
# Solicita la contraseña
read -sp '[sudo] password for remote_admin: ' password; echo
# Reescribe el comando
CMD_EXEC=$(sed "s/^sudo/echo '$password' | sudo -S/" <<< "$CMD_EXEC")
fi
# Recorre los hosts y ejecuta el comando SSH, elimina `-a` para reemplazar las teclas RSA si es necesario
while IFS= read -r host
do
echo -e '\n\033[1;33m'"HOST: ${host}"'\033[0m'
ssh -n "$host" "$CMD_EXEC 2>&1" | tee -a "/tmp/$(basename "${0}").${host}.log"
done <<< "$HOSTS"
Guarda y cierra el archivo. A continuación, crea el script RHEL con el comando:
nano ~/rhel-cmd
En ese archivo, pega lo siguiente:
Entendiendo los permisos de archivos y directorios en UNIX
#!/bin/bash
# Obtén la entrada del usuario como comando
[[ -z ${@} ]] && exit || CMD_EXEC="${@}"
# Obtén los hosts de ~/.ssh/config cuyos nombres comiencen con `rhel-`
HOSTS=$(grep -Po 'Host\s\Krhel-.*' "$HOME/.ssh/config")
# Verifica si el comando de entrada usa sudo
if [[ $CMD_EXEC =~ ^sudo ]]
then
# Solicita la contraseña
read -sp '[sudo] password for remote_admin: ' password; echo
# Reescribe el comando
CMD_EXEC=$(sed "s/^sudo/echo '$password' | sudo -S/" <<< "$CMD_EXEC")
fi
# Recorre los hosts y ejecuta el comando SSH, elimina `-a` para reemplazar las teclas RSA si es necesario
while IFS= read -r host
do
echo -e '\n\033[1;33m'"HOST: ${host}"'\033[0m'
ssh -n "$host" "$CMD_EXEC 2>&1" | tee -a "/tmp/$(basename "${0}").${host}.log"
done <<< "$HOSTS"
Guarda y cierra el archivo. Mueve esos archivos a un directorio en tu ruta, como con el comando:
sudo cp ubuntu-cmd rhel-cmd /usr/local/bin
Cambia la propiedad de esos scripts con:
sudo chown $USER /usr/local/bin/ubuntu-cmd
sudo chown $USER /usr/local/bin/rhel-cmd
Ahora tenemos nuestros hosts Ubuntu y RHEL definidos en nuestro archivo de configuración SSH y nuestros scripts que son ejecutables de forma global. Primero, ejecutaremos el script de Ubuntu y enviaremos el comando sudo apt-get update a nuestros servidores Ubuntu. Para eso, el comando sería:
ubuntu-cmd sudo apt-get update
El script verificará el archivo de configuración SSH en busca de cualquier host que comience con ubuntu y luego te pedirá tanto tu contraseña de sudo como tu contraseña de usuario remoto para cada host. Debería ejecutar correctamente el comando apt-get update en cualquier servidor Ubuntu encontrado en el archivo de configuración SSH.
A continuación, ejecutaremos sudo dnf update en nuestros hosts RHEL con el comando:
rhel-cmd sudo dnf update
Lo mismo sucederá, solo que el comando dnf update se ejecutará en nuestros hosts basados en RHEL definidos en el archivo de configuración SSH.
Y eso es todo lo que hay que hacer para crear un script que ejecute un comando en múltiples hosts definidos en tu archivo de configuración SSH. Usa esta configuración para ver qué otras cosas ingeniosas puedes hacer, porque eso es parte del poder de Linux.
Cómo funciona y cómo probar una fuente de alimentación para PCEn Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Centros de Datos, allí encontraras muchos artículos similares a Cómo ejecutar comandos en múltiples máquinas Linux al mismo tiempo , tenemos lo ultimo en tecnología 2023.
Artículos Relacionados