Linux: ejecutar el mismo comando en muchas máquinas a la vez

39

Tengo alrededor de una docena de cajas de Linux en las que ocasionalmente necesito ejecutar los mismos comandos. ¿Existe una manera más fácil (o automática) de hacer esto además de iniciar sesión en cada máquina y ejecutar el comando, uno a la vez? No son los mismos comandos todo el tiempo y no está en un tiempo preestablecido, por lo que no es algo ideal para herramientas como cron.

Chris Bunch
fuente
pregunta similar serverfault.com/questions/17931/…
hayalci
Finalmente la lista canónica :)
rogerdpack

Respuestas:

12

Hm, tal vez pconsole es la herramienta que deseas.

Nodo
fuente
¡Guau, el pconsole se ve muy bien! Lo instalé sin problemas y parece ser genial hasta ahora. ¡Gracias!
Chris Bunch
Es una de mis herramientas favoritas también. :) np
Nodo
15

También hay ClusterSSH , que, bueno, hace exactamente lo que crees que hace. ¡Yay para nombres descriptivos!

Jörg W Mittag
fuente
404 en SourceForge, parece que ahora está aquí en GitHub .
Pablo A
8

Debe consultar Puppet aquí, hay un artículo de linux.com sobre su configuración y uso

Trent
fuente
1
Hmm, Puppet se ve bastante interesante. Lo revisaré si pconsole comienza a fallarme, ya que lo tengo funcionando y es más fácil que aprender el idioma de Puppet. Gracias por la sugerencia sin embargo!
Chris Bunch
Específicamente, la herramienta Marionette Collective (también llamada mcollective, o mco). Es una parte de la marioneta que te permite hacer cosas en un grupo de anfitriones, en base a hechos de marionetas.
Brian Minton
8

Puedes probar Capistrano . Originalmente es una herramienta de implementación de Rails, pero creció para hacer muchas cosas con máquinas remotas.

Para un enfoque más completo para la administración de múltiples máquinas, puede probar Chef .

rkj
fuente
8

Ansible tiene la capacidad de hacer comandos ad hoc y también se puede expandir para hacer una gestión de configuración completa. La capacidad de emparejar en base a grupos es excelente.

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

Robert
fuente
ansiblefunciona bien con cientos de máquinas a la vez o puede limitarlo a n máquinas a la vez
pollitos
6

Creo que copiaré y pegaré mi respuesta de Stack Overflow , que a la gente parecía gustarle. . .


El problema de cómo ejecutar comandos en muchos servidores a la vez apareció en una lista de correo de Perl el otro día y le daré la misma recomendación que hice allí , que es usar gsh: http://outflux.net/unix/ software / gsh

gsh es similar a la " for box in box1_name box2_name box3_name" solución ya dada pero encuentro que gsh es más conveniente. Configura un archivo / etc / ghosts que contiene sus servidores en grupos como web, db, RHEL4, x86_64 o lo que sea (man ghosts) y luego usa ese grupo cuando llama a 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 ~]$

También puede combinar o dividir grupos fantasma, usando web + db o web-RHEL4, por ejemplo.

También mencionaré que aunque nunca he usado shmux, su sitio web contiene una lista de software (incluido gsh) que le permite ejecutar comandos en muchos servidores a la vez. Capistrano ya ha sido mencionado y (por lo que entiendo) también podría estar en esa lista.

Philip Durbin
fuente
5

Si está en un escritorio KDE, konsole tiene la opción "Enviar entrada a todas las sesiones". Se aplica a todas las sesiones abiertas en la misma ventana de Konsole.

rgmarcha
fuente
5

También puede intentar ssh [user@]hostname [command]y luego recorrer los nombres de host.

Jason V.
fuente
2
Esto realmente no satisface la parte "a la vez" (está serializada, no en paralelo), pero como eso no parece ser un requisito del cuerpo de la pregunta, esta también puede ser una solución decente.
voretaq7
4

También eche un vistazo a func. Func le permite utilizar una arquitectura de módulo para controlar diferentes aspectos de un sistema, desde el manejo de paquetes hasta la ejecución de comandos, etc. Funciona en un módulo cliente / servidor a través de SSL y también tiene un esquema de autenticación bastante flexible.

Palo
fuente
Junto con eso, Func está siendo desarrollado por Red Hat, y es probable que vea un uso ampliado en futuros productos Fedora / RHEL. Este es definitivamente uno para observar, ya que espero que se convierta en la solución estándar de facto para este tipo de problema.
Christopher Cashell
4

He usado ClusterSSH y funciona. Sin embargo, más allá de un cierto número de terminales, no escala bien.

Me sorprende que nadie haya mencionado xargs. Xargs es perfecto para la mayoría de las cosas. De hecho, me he sentido tan cómodo con él que ya nunca uso clusterssh.

Ejemplo

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

(Reinicie apache en todos los servidores web).

JDS
fuente
para los seguidores, la -P30parte significa "ejecutar 30 de ellos en paralelo"
rogerdpack
4

Si ya es usuario de tmux, puede disfrutar de tmux-cssh (significa TMUX-C(luster)-SSH). Le da una lista de nombres de servidores y abre una nueva ventana tmux con una sesión SSH abierta para cada servidor en su propio panel. Todas las pulsaciones de teclas se copian en cada ventana. Dependiendo del número de hosts, la salida puede ser difícil de leer.

champú de manzana
fuente
1
Los enlaces de una línea no son necesariamente útiles. Por favor sea descriptivo. ¿Por qué recomiendas esta herramienta?
Deer Hunter
3

Otras herramientas son:

RunDeck también podría describirse como el ControlTier ligero.

Estas herramientas no solo le brindan un shell de clúster, sino también una interfaz web y puede guardar sus trabajos para su uso futuro.

cristiano
fuente
2

También puede probar Cluster SSH (cssh). No lo he usado, pero hay un artículo en LinuxJournal.com llamado "Administrar servidores múltiples de manera eficiente" que habla de ello.

Brad Beyenhof
fuente
1

¡Use un plato , simple y muy poderoso! Este guión cambió mi vida :) ¡Un guión para gobernarlos a todos!

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

La diligencia shell 'dish' ejecuta comandos vía ssh / rsh / telnet / mysql simultáneamente en varios sistemas. Cambiar la contraseña, actualizar la configuración, copiar archivos, verificar el estado, etc. en cientos de nodos se simplifica. Dish es similar al 'dsh' (shell distribuido) de IBM, pero además permite la ejecución remota de comandos que requieren autenticación. En comparación con otros paquetes de código abierto que incluyen un shell distribuido (o herramientas similares) como ClusterIt, shell de bailarín, shell distribuido en paralelo o C3, dish es un envoltorio de shell remoto delgado y fácil de usar para casos en los que se necesita una solución flexible. Puede navegar por la página del manual del plato en línea aquí.

Guillaume
fuente
1

Aquí hay algunos ejemplos que usan los comandos mencionados en otras respuestas:

pdsh

Puede tomar rangos numéricos, las salidas con el nombre de host primero, parecen realmente mantenidas :

versión más simple:

pdsh -w hostname echo done

salida:

hostname: done

Ejemplo más complicado:

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

salida:

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"

necesita una configuración de shell remota; de lo contrario, usará "rsh", que puede o no estar disponible.

Mac: brew install dsh

pssh

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

Todos pueden tomar una lista de máquinas de un archivo, opcionalmente, también.

Siéntase libre de agregar más ejemplos aquí, es un wiki comunitario

Mac: brew install pssh

Cluster SSH

El clúster SSH (la "versión solo para Mac" aparentemente tiene dos versiones y la otra está aquí ) en realidad abre "terminales reales" con un terminal grande en la parte inferior que envía información a todos los demás. Entonces es como una interfaz de usuario que lo envía a múltiples.

Ex:

csshX hostname0[1-2] hostname3 luego escriba en el cuadro rojo y se dirige a cada ventana de terminal, una por host, que aparece.

mac: brew install csshx(una versión anterior pero aún funciona)

también hay un brew install ansibleFWIW

rogerdpack
fuente