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.lst
contenha 100 hosts. Quero rodar runScript.sh
em 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.lst
vários são selecionados de uma vez (200), e em cada um desses 200 hosts são gerados runScript.sh
usando 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.ssh
batch mode
stdout+stderr
host
$logdir
Finalmente esperamos que um grupo termine antes de lançarmos o próximo grupo, por meio do wait
comando no final do for
loop 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.log
depois done
para 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.