Há uma lista de endereços IP em um arquivo .txt, por exemplo:
1.1.1.1
2.2.2.2
3.3.3.3
Por trás de cada endereço IP, há um servidor e em cada servidor existe um sshd em execução na porta 22. Nem todos os servidores estão na known_hosts
lista (no meu PC, Ubuntu 10.04 LTS / bash).
Como posso executar comandos nesses servidores e coletar a saída?
Idealmente, eu gostaria de executar os comandos em paralelo em todos os servidores.
Vou usar autenticação de chave pública em todos os servidores.
Aqui estão algumas armadilhas em potencial:
- O ssh solicita que eu coloque a chave ssh dos servidores no meu
known_hosts
arquivo. - Os comandos fornecidos podem retornar um código de saída diferente de zero, indicando que a saída é potencialmente inválida. Eu preciso reconhecer isso.
- Uma conexão pode falhar ao ser estabelecida com um determinado servidor, por exemplo, devido a um erro de rede.
- Deve haver um tempo limite, caso o comando seja executado por mais tempo do que o esperado ou o servidor fique inativo durante a execução do comando.
Os servidores são AIX / ksh (mas acho que isso realmente não importa.
ssh
scripting
parallelism
LanceBaynes
fonte
fonte
Respostas:
Supondo que você não consiga instalar o pssh ou outros, você pode fazer algo semelhante a:
fonte
-o StrictHostKeyChecking=no
para evitar isso. No entanto, é melhor verificar todos os servidores a partir de uma linha de comando primeiro, para que as chaves do host possam ser adicionadas.wait
comando recupera esses recursos, incluindo o código de retorno do processo (como os processos foram encerrados). Então, se mais tarde no programa, você colocar outro processo, digamos uma compactação, em segundo plano e precisar esperar por ela, sem esse loop, a espera recuperará um dos programas ssh concluídos, não a compactação - que ainda pode estar correndo. Você obteria um status de retorno no processo filho errado. É bom limpar depois de si mesmo.Existem várias ferramentas disponíveis que permitem efetuar login e executar uma série de comandos em várias máquinas ao mesmo tempo. Aqui estão alguns:
fonte
Se você gosta mais de scripts Python do que
bash
scripts, o Fabric pode ser a ferramenta para você.Na página inicial do Fabric :
fonte
Eu uso o GNU paralelo para isso, mais especificamente você pode usar esta receita:
Com
your.txt
sendo o arquivo com o IP do servidor de endereços / nomes.fonte
ssh
existir também, mas você precisa de alguma maneira de fazer login nos outros computadores e essas maneiras costumavam ser menos seguras (comorsh
). Você não descreve o que está usando agora para ir de máquina em máquina (telnet
?,rsh
?).Configuração muito básica:
Autenticar com nome / senha não é realmente uma boa ideia. Você deve configurar uma chave privada para isso:
fonte
ssh $host $command
para cada host. Tente executar esses comandos manualmente para descobrir o que está acontecendo.Eu sugiro Ansible.cc . É um gerenciador de configuração e despachante de comando.
fonte
Eu acho que você está procurando pssh e as versões paralelas relacionadas do usual scp, rsync, etc.
fonte
Criei uma ferramenta de código aberto chamada Overcast para facilitar esse tipo de coisa.
Primeiro você define seus servidores:
Em seguida, você pode executar vários comandos e arquivos de script entre eles, sequencialmente ou em paralelo, da seguinte maneira:
fonte
O projeto Hypertable adicionou recentemente uma ferramenta ssh de vários hosts. Essa ferramenta é criada com libssh e estabelece conexões e emite comandos de forma assíncrona e paralela para máximo paralelismo. Consulte Ferramenta SSH de vários hosts para obter a documentação completa. Para executar um comando em um conjunto de hosts, execute-o da seguinte maneira:
Você também pode especificar um nome de host ou padrão de IP, por exemplo:
Ele também suporta uma
--random-start-delay <millis>
opção que atrasará o início do comando em cada host por um intervalo aleatório entre 0 e<millis>
milissegundos. Essa opção pode ser usada para evitar problemas de rebanho trovejante quando o comando em execução acessa um recurso central.fonte
Eu desenvolvi o collectnode Muito simples e eficaz para executar tarefas em vários servidores (janelas incluídas)
Como usar o CollectNode:
Crie a lista de servidores para trabalhar:
Execute o CollectNode passando a lista de saques:
Opcionalmente, é possível filtrar os resultados, por exemplo, este comando exibe apenas o servidor em que a condição é realizada.
https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/
fonte
Apenas um alerta para uma pergunta muito boa:
A melhor solução que encontrei é, não surpreendentemente, o tmux.
Você pode fazer o Ctrl-B: configurar painéis de sincronização no tmux para obter resultados incríveis. Você deve ter todas as suas conexões ssh abertas, em diferentes painéis de 1 janela do Tmux para isso.
fonte
Talvez algo assim funcione, para executar o comando em vários hosts? suponha que todos os hosts estejam configurados em .ssh / config para login sem senha.
$ < hosts.txt xargs -I {} ssh {} command
fonte
Crie um arquivo / etc / sxx / hosts
preencher assim:
compartilhe a chave ssh em todas as máquinas.
Instale o sxx do pacote:
https://github.com/ericcurtin/sxx/releases
Em seguida, execute o comando da seguinte maneira:
fonte
Use o Paramiko http://www.paramiko.org/ e o paralelismo baseado em thread https://docs.python.org/3/library/threading.html . O código abaixo permite executar vários comandos em cada servidor em paralelo!
Nota: repita as instruções acima para cada servidor.
fonte
Eu acho que "esperar" é o que você precisa.
Muitas pessoas nem sabem que existe. É um programa baseado em tcl que fará perguntas e possíveis respostas em seu nome. Dê uma olhada em https://wiki.tcl-lang.org/page/Expect
fonte