Como posso executar comandos select em vários servidores a partir de um script de shell?

Como posso executar comandos select em vários servidores a partir de um script de shell?

Como posso executar scripts a partir de argumentos em vários servidores?

Estou tentando criar uma lista de comandos e executar comandos em cada servidor. Não consigo gerar a lista de comandos de uma forma que possa ser evalcorreta em cada servidor.

Aqui está todo o meu roteiro até agora. Essencialmente, gostaria de fazer login em cada servidor $server_arraye executar todos os comandos em $script_arr ou apenas o comando selecionado.

#!/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"

Responder1

capistrano,mssh, eclustersshsão todas ferramentas que afirmam emitir comandos para vários servidores ao mesmo tempo. É uma tarefa tão complexa, como você descobriu, que provavelmente é melhor não reinventar a roda.

Responder2

Eu faria isso com o Puppet Bolt. Ele permite que comandos de defesa sejam executados remotamente com facilidade. Basta baixar o Puppet Bolt (GRATUITO) e usá-lo para emitir o comando em uma lista fornecida de hosts.

Informações/Download do Puppet Bolt

Basta instalar o bolt e certificar-se de ter as chaves ssh configuradas em todos os hosts

Responder3

1). Escreva o script do lado do servidor com todos os comandos necessários e redirecionamento de saída para log. Por exemplo, "server-side.sh", que exibe o nome do servidor e quanto espaço livre neste servidor:

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

2). Escreva o segundo script, que será executado na estação de trabalho local. Por exemplo, "run-server-side.sh", que envia um script ao servidor, executa e retorna o log 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:Os servidores devem ser configurados em .ssh/configautorização por chave. Por exemplo:

Host server_1
HostName address_1
User user_name_1

Host server_2
HostName address_2
User user_name_2

Benefícios.

  • Apenas bash "nativo" e "integrado" - sem nenhum software adicional.
  • Todo servidor remoto sempre terá a versão mais recente do script.
  • Você pode escrever e editar um script bastante complexo na estação de trabalho local em seu editor favorito.

Lugares para evolução.

  • Um script grande do lado do servidor é confortável para ser dividido em várias tarefas pequenas == um script e carregá-los via rsync.
  • Para um resultado bonito no console é possível usar cores diferentes para cada servidor ou tarefa:http://misc.flogisoft.com/bash/tip_colors_and_formatting

Responder4

Há algumas coisas que tu podes fazer.

Não sei se você prefere que os comandos sejam executados em paralelo ou serial.

Se preferir rodar em série, você pode fazer algo como:

  1. Faça uma lista de todos os servidores nos quais deseja que os comandos sejam executados.
  2. correr:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done

Se você deseja que os comandos sejam executados em paralelo, você pode usar a ferramenta paralelo-ssh que pode ser instalada em ambos os sistemas operacionais CentOS/Ubuntu.

Se você quiser, escrevi um script de shell que envolve o comando paralelo-ssh e permite ao usuário fornecer uma lista de servidores e comandos e o script emitirá os comandos em todos os servidores em paralelo.

O roteiro pode ser encontradono meu Github.

Uma última coisa que posso oferecer é usar o Ansible com inventário.

informação relacionada