¿Cómo puedo ejecutar comandos de selección en varios servidores desde un script de shell?

¿Cómo puedo ejecutar comandos de selección en varios servidores desde un script de shell?

¿Cómo puedo ejecutar scripts a partir de argumentos en varios servidores?

Estoy intentando crear una lista de comandos y luego ejecutar comandos en cada servidor. No puedo generar la lista de comandos de una manera que pueda evalejecutarse correctamente en cada servidor.

Aquí está mi guión completo hasta ahora. Básicamente, me gustaría iniciar sesión en cada servidor $server_arrayy ejecutar todos los comandos en $script_arr o solo el comando seleccionado.

#!/bin/bash

# run-commands.sh [optional script name]
# ex. run-commands.sh
# ex. run-commands.sh date_script
# ex. run-commands.sh hostname_script

# declare -a server_arr=("a.local" "b.local")
declare -a server_arr=("localhost")

if [ $# -eq 0 ]
  then
    # Default Processes
    declare -a script_arr=("date_script" "hostname_script")
else
    declare -a script_arr=($1)
fi

build_cmds()
{

    script_arr=("${@}")
    declare -a cmds

    for script_name in "${script_arr[@]}"
    do

        case "$script_name" in
            "date_script")
                cmds+='printf "executing date command\n; "'
                cmds+='date'
                cmds+='printf "date command executed\n; "'
            ;;
            "hostname_script")
                cmds+='printf "executing date command\n; "'
                cmds+='date'
                cmds+='printf "date command executed\n; "'
            ;;
        esac

    done

}

build_cmds "${script_arr[@]}"

for cmd in "${cmds[@]}"
do
    ssh user@$server_name -T 'eval "$cmd"'
done

echo "Completed executing all commands"

Respuesta1

capistrano,mssh, yclustersshson todas herramientas que pretenden emitir comandos a varios servidores a la vez. Como usted descubrió, es una tarea bastante compleja, por lo que probablemente sea mejor no reinventar la rueda.

Respuesta2

Haría esto con Puppet Bolt... permite que los comandos de defensa se ejecuten de forma remota con facilidad. Simplemente descargue Puppet Bolt (GRATIS) y utilícelo para emitir el comando en una lista proporcionada de hosts.

Información/Descarga de Puppet Bolt

Simplemente instale Bolt y asegúrese de tener claves ssh configuradas en todos los hosts

Respuesta3

1). Escriba un script del lado del servidor con todos los comandos necesarios y la redirección de salida para iniciar sesión. Por ejemplo, "server-side.sh", que muestra el nombre del servidor y cuánto espacio libre hay en este servidor:

#! /bin/bash
cat /etc/hostname > log.txt
date > log.txt
df -h > log.txt

2). Escriba el segundo script, que se ejecutará en la estación de trabajo local. Por ejemplo, "run-server-side.sh", que envía un script al servidor, lo ejecuta y devuelve el registro de resultados:

#! /bin/bash
SERVERS="server_1 server_2"

for ONE_SERVER in SERVERS
do
  scp server-side.sh $ONE_SERVER:path
  ssh $ONE_SERVER path/server-side.sh
  scp $ONE_SERVER:path/log.txt
  mv log.txt "log-$ONE_SERVER.txt"
done

Notas:Los servidores deben estar configurados en .ssh/config, autorización por clave. Por ejemplo:

Host server_1
HostName address_1
User user_name_1

Host server_2
HostName address_2
User user_name_2

Beneficios.

  • Simplemente bash "nativo" e "integrado", sin ningún software adicional.
  • Cada servidor remoto siempre tendrá la versión más reciente del script.
  • Puede escribir y editar un script bastante complejo en la estación de trabajo local en Su editor favorito.

Lugares para la evolución.

  • Es cómodo dividir los scripts grandes del lado del servidor en varios pequeños: una tarea == un script y cargarlos a través de rsync.
  • Para obtener resultados bonitos en la consola, es posible utilizar diferentes colores para cada servidor o tarea:http://misc.flogisoft.com/bash/tip_colors_and_formatting

Respuesta4

Hay algunas cosas que puedes hacer.

No sé si prefieres que los comandos se ejecuten en paralelo o en serie.

Si prefieres ejecutar en serie, puedes hacer algo como:

  1. Haga una lista de todos los servidores en los que desea que se ejecuten los comandos.
  2. correr:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done

Si desea que los comandos se ejecuten en paralelo, puede utilizar la herramienta paralelo-ssh que se puede instalar en ambos sistemas operativos CentOS/Ubuntu.

Si lo desea, escribí un script de shell que incluye el comando paralelo-ssh y permite al usuario proporcionar una lista de servidores y comandos, y el script emitirá los comandos en todos los servidores en paralelo.

El guión se puede encontrar.en mi Github.

Una última cosa que puedo ofrecer es utilizar Ansible con inventario.

información relacionada