Hay una lista de direcciones IP en un archivo .txt, por ejemplo:
1.1.1.1
2.2.2.2
3.3.3.3
Detrás de cada dirección IP hay un servidor, y en cada servidor hay un sshd ejecutándose en el puerto 22. No todos los servidores están en la known_hosts
lista (en mi PC, Ubuntu 10.04 LTS / bash).
¿Cómo puedo ejecutar comandos en estos servidores y recopilar la salida?
Idealmente, me gustaría ejecutar los comandos en paralelo en todos los servidores.
Usaré la autenticación de clave pública en todos los servidores.
Aquí hay algunos peligros potenciales:
- El ssh me pide que coloque la clave ssh de los servidores dados en mi
known_hosts
archivo. - Los comandos dados pueden devolver un código de salida distinto de cero, lo que indica que la salida es potencialmente inválida. Necesito reconocer eso.
- Es posible que no se pueda establecer una conexión con un servidor determinado, por ejemplo, debido a un error de red.
- Debería haber un tiempo de espera, en caso de que el comando se ejecute por más tiempo de lo esperado o el servidor se caiga mientras se ejecuta el comando.
Los servidores son AIX / ksh (pero creo que eso realmente no importa.
ssh
scripting
parallelism
LanceBaynes
fuente
fuente
Respuestas:
Suponiendo que no puede instalar pssh u otros, puede hacer algo similar a:
fuente
-o StrictHostKeyChecking=no
para evitarlo. Sin embargo, es mejor escanear todos los servidores desde una línea de comandos para poder agregar las claves del host.wait
comando reclama esos recursos, incluido el código de retorno del proceso (cómo salieron los procesos). Luego, si más adelante en el programa, coloca otro proceso, digamos una compresión, en segundo plano y necesita esperar, luego sin este ciclo, la espera recuperará uno de los programas ssh completos, no la compresión, que aún puede estar corriendo Obtendría un estado de devolución en el proceso secundario incorrecto. Es bueno limpiar después de ti mismo.Existen varias herramientas que le permiten iniciar sesión y ejecutar series de comandos en varias máquinas al mismo tiempo. Aquí hay una pareja:
fuente
Si te gustan las secuencias de
bash
comandos de Python más que las secuencias de comandos, Fabric podría ser la herramienta para ti.Desde la página de inicio de Fabric :
fuente
Yo uso GNU paralelo para eso, más específicamente puedes usar esta receta:
Al
your.txt
ser el archivo con la dirección IP / nombres del servidor.fuente
ssh
existiera también, pero necesitas alguna forma de iniciar sesión en las otras computadoras y esas formas solían ser menos seguras (comorsh
). No describe lo que está utilizando ahora para pasar de una máquina a otra (telnet
?,rsh
?).Configuración muy básica:
Autenticar con nombre / contraseña no es realmente una buena idea. Debe configurar una clave privada para esto:
fuente
ssh $host $command
para cada host. Intente ejecutar esos comandos manualmente para averiguar qué está sucediendo.Sugiero Ansible.cc . Es un administrador de configuración y un despachador de comandos.
fuente
Creo que estás buscando pssh y las versiones paralelas relacionadas de los habituales scp, rsync, etc.
fuente
He construido una herramienta de código abierto llamado Tormenta de hacer este tipo de cosas más fácil.
Primero define sus servidores:
Luego puede ejecutar múltiples comandos y archivos de script a través de ellos, ya sea secuencialmente o en paralelo, de la siguiente manera:
fuente
El proyecto Hypertable ha agregado recientemente una herramienta ssh de múltiples hosts. Esta herramienta está construida con libssh y establece conexiones y emite comandos de forma asíncrona y en paralelo para obtener el máximo paralelismo. Consulte Herramienta SSH de múltiples hosts para obtener la documentación completa. Para ejecutar un comando en un conjunto de hosts, debe ejecutarlo de la siguiente manera:
También puede especificar un nombre de host o un patrón de IP, por ejemplo:
También admite una
--random-start-delay <millis>
opción que retrasará el inicio del comando en cada host en un intervalo de tiempo aleatorio entre 0 y<millis>
milisegundos. Esta opción se puede utilizar para evitar problemas de rebaño cuando el comando que se ejecuta accede a un recurso central.fuente
He desarrollado collectnode Muy simple y efectivo para ejecutar tareas en varios servidores (ventanas incluidas)
Cómo usar CollectNode:
Cree la lista de servidores para trabajar con:
Ejecute CollectNode pasando la lista de servicios:
Opcionalmente, es posible filtrar los resultados, por ejemplo, este comando solo muestra el servidor donde se cumple la condición.
https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/
fuente
Solo un aviso para una muy buena pregunta:
La mejor solución que he encontrado es, no sorprendentemente, tmux.
Puede hacer Ctrl-B: setw sincronizar paneles en tmux para obtener un resultado sorprendente. Debe tener todas sus conexiones ssh abiertas, en diferentes paneles de 1 ventana de Tmux para esto.
fuente
¿Tal vez algo como esto funciona, para ejecutar comandos en varios hosts? supongamos que todos los hosts están configurados en .ssh / config para iniciar sesión sin contraseña.
$ < hosts.txt xargs -I {} ssh {} command
fuente
Crear un archivo / etc / sxx / hosts
poblar así:
Compartir clave ssh en todas las máquinas.
Instale sxx desde el paquete:
https://github.com/ericcurtin/sxx/releases
Luego ejecute el comando así:
fuente
Utilice Paramiko http://www.paramiko.org/ y paralelismo basado en hilos https://docs.python.org/3/library/threading.html. ¡El código de abajo permite ejecutar múltiples comandos en cada servidor en paralelo!
Nota: repita las instrucciones anteriores para cada servidor.
fuente
Creo que "esperar" es lo que necesitas.
Mucha gente ni siquiera sabe que existe. Es un programa basado en tcl que hará preguntas y posibles respuestas en su nombre. Echa un vistazo a https://wiki.tcl-lang.org/page/Expect
fuente