Como desligar uma lista de servidores, certificando-se de que o primeiro esteja desligado antes de desligar o próximo?

4

Eu tenho uma lista de 17 servidores neste formato:

172.16.6.45    i-052463fs (test-mv1)
172.16.6.46    i-9e2263rf (test-mv2)

Eu gostaria que um script que pudesse fazer o ssh / login em cada um desses servidores e desligá-los, o que é bastante fácil, mas o problema é que eles precisam ser desativados em uma ordem específica mostrada acima (abaixo da lista ) onde cada precedente deve ser completamente desligado antes de iniciar o próximo encerramento.

Talvez uma maneira de colocar um loop atrás do comando que pinga a cada n segundos e quebre quando nenhuma resposta é recebida dentro de k segundos?

    
por melv 20.08.2015 / 17:59

2 respostas

4

Você pode fazer algo como:

while IFS=' (' read <&3 ip id name rest; do
  ssh -n -o ConnectTimeout=3 -o BatchMode=yes -o HostKeyAlias="$name" "$ip" poweroff &&
    while ping -qw 10 -c3 "$ip"; do
      sleep 1
    done
done 3< list.txt

Algumas notas sobre esse código:

  • Usamos a parte nome como HostKeyAlias, talvez $id faça mais sentido. Idealmente, você precisaria de algo anexado à chave do host do servidor sshd.
  • Usamos -n para ssh e o BatchMode, pois estamos fazendo um script autônomo aqui. Você também pode querer especificar uma dedicar UserKnownHostsFile para essa finalidade.
  • Não executamos o loop while se ssh não for bem-sucedido. Você também pode querer sair do script com um erro nesse caso. Você também pode querer adicionar um limite superior nas iterações do loop while para considerar a falha de desligamento dos servidores.
  • Nosso loop faz 3 sondagens de ping separadas por 1 segundo e desiste após 10 segundos. ping (pelo menos a de iputils na Debian retornará true se pelo menos uma sonda for respondida, o que deve cobrir a perda genuína de pacotes. O segundo de atraso entre 2 de 3 das sondas evita inundar o servidor como um while ping -c1 loop faria.O atraso extra após os 3 probes terem sido enviados e não respondidos, dá ao servidor tempo suficiente para desligar depois de ter destruído sua pilha de IPs.
por 21.08.2015 / 10:41
2
ssh host sudo shutdown -h -y now ; ping -c 1 host ; while [ $? = 0 ] ; do ping -c 1 host ; done
    
por 20.08.2015 / 18:06