Linux - Executando o mesmo comando em várias máquinas ao mesmo tempo

39

Eu tenho cerca de uma dúzia de caixas Linux em que ocasionalmente preciso executar os mesmos comandos. Existe uma maneira mais fácil (ou automatizada) de fazer isso, além de fazer logon em cada máquina e executar o comando, um de cada vez? Não é o mesmo comando o tempo todo e não é um horário predefinido, portanto não é algo ideal para ferramentas como cron.

Chris Bunch
fonte
pergunta semelhante serverfault.com/questions/17931/…
hayalci
Finalmente, a lista canônica :)
rogerdpack

Respostas:

12

Talvez o console seja a ferramenta que você deseja.


fonte
Uau, pconsole parece muito legal! Eu instalei sem problemas e parece ser ótimo até agora. Obrigado!
Chris Bunch #
É uma das minhas ferramentas favoritas também. :) np
15

Há também o ClusterSSH , que, bem, faz exatamente o que você pensa que faz. Yay para nomeação descritiva!

Jörg W Mittag
fonte
404 no SourceForge, parece que agora está aqui no GitHub .
Pablo A #
8

Você deve verificar o Puppet, aqui está um artigo do linux.com sobre sua configuração e uso

trent
fonte
11
Hmm, Puppet parece bem interessante. Vou dar uma olhada se o console começar a falhar, pois já o tenho funcionando e é mais fácil do que aprender o idioma do Puppet. Obrigado pela sugestão!
Chris Bunch #
Especificamente, a ferramenta Marionette Collective (também chamada mcollective, ou mco). É uma parte do boneco que permite fazer coisas em um grupo de anfitriões, com base em fatos do boneco.
27717 Brian Minton
8

Não negligencie pssh e dsh também; ambos são muito parecidos com o gsh que @Philip Durbin mencionou.

pjz
fonte
11
Há também "pdssh" similar, aparentemente sourceforge.net/projects/pdsh
rogerdpack
8

Você pode tentar Capistrano . Originalmente, é uma ferramenta de implantação do Rails, mas cresceu para fazer muitas coisas com máquinas remotas.

Para uma abordagem mais completa à administração de várias máquinas, experimente o Chef .

rkj
fonte
8

O Ansible tem capacidade para executar comandos ad hoc e também é expansível para gerenciar completamente a configuração. A capacidade de combinar com base em grupos é excelente.

http://docs.ansible.com/intro_adhoc.html

Robert
fonte
ansiblefunciona bem com centenas de máquinas de uma só vez ou você pode limitá-lo a n máquinas de cada vez
pintos
6

Acho que vou copiar e colar minha resposta do Stack Overflow , da qual as pessoas pareciam gostar. . .


O problema de como executar comandos em muitos servidores de uma só vez surgiu em uma lista de emails do Perl outro dia e darei a mesma recomendação que dei lá , que é usar gsh: http://outflux.net/unix/ software / gsh

O gsh é semelhante à " for box in box1_name box2_name box3_name" solução já fornecida, mas acho que o gsh é mais conveniente. Você configura um arquivo / etc / ghosts contendo seus servidores em grupos como web, db, RHEL4, x86_64 ou qualquer outra coisa (man ghosts) e depois usa esse grupo quando chama gsh.

[pdurbin@beamish ~]$ gsh web "cat /etc/redhat-release; uname -r"
www-2.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-2.foo.com: 2.6.9-78.0.1.ELsmp
www-3.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-3.foo.com: 2.6.9-78.0.1.ELsmp
www-4.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-4.foo.com: 2.6.18-92.1.13.el5
www-5.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-5.foo.com: 2.6.18-92.1.13.el5
[pdurbin@beamish ~]$

Você também pode combinar ou dividir grupos fantasmas, usando web + db ou web-RHEL4, por exemplo.

Mencionarei também que, embora nunca tenha usado o shmux, seu site contém uma lista de software (incluindo o gsh) que permite executar comandos em vários servidores ao mesmo tempo. Capistrano já foi mencionado e (pelo que entendi) também poderia estar nessa lista.

Philip Durbin
fonte
5

Se você estiver na área de trabalho do KDE, o konsole tem a opção "Enviar entrada para todas as sessões". Isso se aplica a todas as sessões abertas na mesma janela do konsole.

rgmarcha
fonte
5

Você também pode tentar ssh [user@]hostname [command]percorrer os nomes dos hosts.

Jason V.
fonte
2
Isso realmente não satisfaz a parte "de uma só vez" (é serializada, não em paralelo), mas como isso não parece ser um requisito do corpo da pergunta, também pode ser uma solução decente.
voretaq7
4

Também dê uma olhada no func. O Func permite que você use uma arquitetura de módulo para controlar diferentes aspectos de um sistema, desde lidar com pacotes, executar comandos etc. Ele funciona em um módulo cliente / servidor sobre SSL e também possui um esquema de autenticação bastante flexível.

Bastão
fonte
Junto com isso, o Func está sendo construído pela Red Hat e provavelmente verá um uso expandido nos futuros produtos do Fedora / RHEL. Definitivamente, este é um ponto de observação, pois espero que ele se torne a solução padrão de fato para esse tipo de problema.
22620 Christopher Cashell
4

Eu usei o ClusterSSH e funciona. No entanto, além de um certo número de terminais, ele não escala bem.

Estou surpreso que ninguém tenha mencionado xargs. Xargs é perfeito para a maioria das coisas. Na verdade, fiquei tão confortável com isso que nunca mais uso clusterssh.

Exemplo

echo -n host1 host2 host3 host4|xargs -d" " -n1 -P30 -I+ ssh + "sudo service apache2 restart"

(Reinicie o apache em todos os hosts da web.)

JDS
fonte
para os seguidores, os -P30meios de peça "executar 30 deles em paralelo"
rogerdpack
4

Se você já é um usuário tmux, poderá desfrutar do tmux-cssh (significa TMUX-C(luster)-SSH). Você fornece uma lista de nomes de servidores e ela abre uma nova janela do tmux com uma sessão SSH aberta para cada servidor em seu próprio painel. Todas as teclas são copiadas para cada janela. Dependendo do número de hosts, a saída pode ser difícil de ler.

maçãs
fonte
11
Os links de uma linha não são necessariamente úteis. Por favor, seja descritivo. Por que você recomenda esta ferramenta?
Deer Hunter
3

Outras ferramentas são:

O RunDeck também pode ser descrito como o ControlTier leve.

Essas ferramentas não apenas fornecem um shell de cluster, mas também um front-end da Web e você pode salvar seus trabalhos para uso futuro.

cristão
fonte
2

Você também pode tentar o SSH de cluster (cssh). Eu não o usei, mas há um artigo no LinuxJournal.com chamado "Gerenciar vários servidores com eficiência" que fala sobre isso.

Brad Beyenhof
fonte
1

Use prato , simples e muito poderoso! Este script mudou minha vida :) Um script para governar todos eles!

http://nic-nac-project.org/~drimiks/gnu/dish.shtml

O shell de diligência 'dish' executa comandos via ssh / rsh / telnet / mysql simultaneamente em vários sistemas. Mudar a senha, atualizar a configuração, copiar arquivos, verificar o status etc. em centenas de nós é simplificado. O prato é semelhante ao 'dsh' (shell distribuído) da IBM, mas além disso permite a execução remota de comandos que exigem autenticação. Em comparação com outros pacotes de código aberto que incluem um shell distribuído (ou ferramentas similares) como ClusterIt, shell do dançarino, shell distribuído paralelo ou C3, o dish é um invólucro de shell remoto fino e fácil de usar para os casos em que é necessária uma solução flexível. Você pode navegar na página de manual do prato on-line aqui.

Guillaume
fonte
1

Aqui estão alguns exemplos usando os comandos mencionados em outras respostas:

pdsh

Pode assumir intervalos numéricos, as saídas com o nome do host primeiro, parecem realmente mantidas :

versão mais simples:

pdsh -w hostname echo done

saída:

hostname: done

Exemplo mais complicado:

pdsh -w username@hostname[7-8],username@otherhost "sleep 5 && echo done"

saída:

hostname8: done
hostname7: done
otherhost: done

Mac: brew install pdsh

dsh

dsh -m user@host,user@host --remoteshell ssh --concurrent-shell -- "sleep 5 && echo done"

precisa de configuração de shell remoto, caso contrário, ele usará "rsh", que pode ou não estar disponível.

Mac: brew install dsh

pssh

pssh -i -H user@host -H user@host "sleep 5 && echo done"

Todos eles podem obter a lista de máquinas de um arquivo, opcionalmente também.

Sinta-se livre para adicionar mais exemplos aqui, é um wiki da comunidade

Mac: brew install pssh

Cluster SSH

O cluster SSH (a "versão apenas para mac", aparentemente, existem duas versões que a outra está aqui ) na verdade abre "terminais reais" com um grande terminal na parte inferior que envia entrada para todos os outros. Portanto, é como uma interface do usuário que a envia para vários.

Ex:

csshX hostname0[1-2] hostname3 digite na caixa vermelha e ele vai para cada janela do terminal, uma por host, que é exibida.

mac: brew install csshx(uma versão antiga, mas ainda funciona)

há também um brew install ansibleFWIW

rogerdpack
fonte