GNU Parallel e sshpass com lista de servidores em um loop

1

Com este loop nós atualizamos seqüencialmente em todos os servidores (lista de servidores = consul members | grep awk {'print $2'} | cut -d ":" -f1 ) o pacote consul .

for i in $(consul members | grep awk {'print $2'} | cut -d ":" -f1) ; do sshpass -p $PASSWORD ssh -oStrictHostKeyChecking=no -q root@$i "hostname && yum clean all && yum -y update consul && systemctl restart consul.service" ; done

Temos mais de 1000 servidores, portanto, queremos executar o sshpass em paralelo em 10 servidores. Eu encontrei o Paralelo GNU para esta tarefa.

Howo usa com sshpass e garante que nenhum servidor (lista de servidores) seja feito duas vezes?

    
por Ivanov 24.06.2016 / 14:49

3 respostas

3

De fato, pssh parece a melhor solução. Se você precisar usar parallel , deverá ser bastante simples: canalize os nomes de host um por linha em um único comando que use {} como um placehold. Por exemplo:

consul members | ... awk {'print $2'} | cut -d ":" -f1 |
parallel -j 10 sshpass -p "$PASSWORD" ssh -oStrictHostKeyChecking=no -q root@{} "hostname && yum clean all && yum -y update consul && systemctl restart consul.service"

Usar sshpass não deve fazer diferença. Teste primeiro com um comando simples, como apenas hostname .

    
por 24.06.2016 / 21:06
2

Use pssh com autenticação de chave de host ssh, é melhor

primeiro, na caixa local, como o usuário se conecta, faça o ssh-keygen para criar uma chave pública

use então ssh-copy-id para copiar essa chave pública para todos os servidores remotos. então faça algo como:

pssh -h <(consul members | grep awk {'print $2'} | cut -d ":" -f1) -o /tmp/update-consul-servers -i "yum clean all && yum -y update consul && systemctl restart consul.service"
    
por 24.06.2016 / 15:37
0

Todos, este é o shell funcional que solicita a senha no script, faz o comando require e lista qual servidor não está autenticado.

para i em cat /root/fahmi/up.list ;
Faz   E se ! sshpass -p 'senha' ssh -n -T -o StrictHostKeyChecking = nenhum usuário @ "$ i";   então     echo "Servidor $ i não acessível";   fi  sshpass -p 'senha' ssh -T -o StrictHostKeyChecking = nenhum usuário @ "$ i" < ./ command.sh

concluído

    
por 22.10.2018 / 04:17