Execute o comando em vários servidores em paralelo usando shell script

Execute o comando em vários servidores em paralelo usando shell script

Eu tenho milhares de máquinas remotas. Quero executar alguns comandos específicos em todos eles, mas em paralelo. Eu uso estes comandos que são executados sequencialmente:

for f in `cat host.lst`
do
       ./runScript.sh $f
done

Suponhamos que host.lstcontenha 100 hosts. Quero rodar runScript.shem 100 hosts em paralelo. Além disso, os registros devem ser mantidos.

Não consigo instalar nenhum utilitário em minha máquina, como PSSH.

Pesquisei bastante e encontrei esses links, mas eles não ajudaram. Não entendo como eles funcionam:

Execute comandos automaticamente por SSH em muitos servidores

Execute o comando em vários arquivos que correspondam a um padrão em paralelo

Alguém pode explicar a lógica?

Responder1

logdir=`mktemp -d`
bunch=200

IFS=$'\n'
for hosts in $(< hosts.lst xargs -r -L "$bunch"); do
   IFS=" ";
   for host in $hosts; do
      ssh -n -o BatchMode=yes "$host" './runScript.sh' 1>"$logdir/$host.log" 2>&1 &
   done
   wait
done

Supondo que milhares de hosts estejam listados uma/linha no arquivo e, a partir deles , hosts.lstvários são selecionados de uma vez (200), e em cada um desses 200 hosts são gerados runScript.shusando e ao mesmo tempo preservando o vomitando de cada um desses trabalhos em segundo plano em um arquivo com o nome no diretório , que pode ser examinado como e quando necessário.sshbatch modestdout+stderrhost$logdir

Finalmente esperamos que um grupo termine antes de lançarmos o próximo grupo, por meio do waitcomando no final do forloop interno.

Responder2

A seguinte modificação em seu script, que não requer nenhum outro utilitário, será executada em paralelo, mas poderá atingir limites dependendo das limitações de identificadores de arquivos abertos de seus hosts:

for f in $(cat host.lst); do
       ./runScript.sh $f &
done

Para capturar os resultados em um log, basta adicionar > run.logdepois donepara salvar em um novo arquivo, run.log.

A principal mudança é a adição de &, que executa um processo em segundo plano, em vez de esperar que ele seja concluído antes de executar o próximo comando.

informação relacionada