Estoy buscando una forma de impulsar la configuración de una máquina central a varias máquinas remotas sin la necesidad de instalar nada en las máquinas remotas.
El objetivo es hacer algo como lo haría con herramientas como cfengine
, pero en un conjunto de máquinas que no tienen agentes configurados. En realidad, esta podría ser una buena técnica de configuración cfagent
en un conjunto de máquinas remotas existentes.
ssh
configuration
bash
scripting
tremoloqui
fuente
fuente
Respuestas:
Puede pasar un script y hacer que se ejecute de manera efímera al conectarlo y ejecutar un shell.
p.ej
Naturalmente, la
"ls -l; echo 'Hello World'"
parte podría reemplazarse con un script bash almacenado en un archivo en la máquina local.p.ej
¡Salud!
fuente
Hay varias formas de hacerlo.
1:
2:
3:
el número 3 es mi forma preferida, permite comandos interactivos, por ejemplo
su -S service nginx restart
(El n. ° 1 consumirá el resto del script como entrada para la pregunta de contraseña cuando lo use
su -S
).fuente
Recomendaría la tela de Python para este propósito:
Debería poder usar lo anterior para comenzar. Consulte la excelente documentación de Fabric para hacer el resto. Como anexo, es totalmente posible escribir su secuencia de comandos completamente dentro de Fabric; no es necesario copiar, sin embargo, debe tenerse en cuenta que para cambiar la secuencia de comandos en todas las máquinas, solo necesitaría editar la copia local y volver a implementarla. Además, con un poco más que el uso básico de la API, puede modificar el script en función del host en el que se está ejecutando actualmente y / u otras variables. Es una especie de Esperanza pitónica.
fuente
run
ysudo
), ni siquiera es necesario.Esto es exactamente para lo que se usa Ansible. No hay agente, solo tiene que crear un archivo de texto llamado:
con contenido que se parece a:
Esto especificaría que las máquinas "web1, web2 ... web8" están en el grupo "webhosts". Entonces puedes hacer cosas como:
para reiniciar el servicio apache2 en todas sus máquinas, usando sudo.
Puedes hacer comandos sobre la marcha como:
o puede ejecutar un script local en la máquina remota:
o puede crear un libro de jugadas (consulte la documentación para obtener más detalles) con una configuración completa a la que desea que se ajusten sus servidores y desplegarlo con:
Básicamente, puede comenzar a usarlo como una herramienta de línea de comandos para ejecutar comandos en varios servidores y expandir su uso a una herramienta de configuración completa como mejor le parezca.
fuente
ansible webhosts -m script script.sh
Como se explica en esta respuesta , puede usar heredoc :
Debe tener cuidado con heredoc, porque solo envía texto, pero en realidad no espera la respuesta. Eso significa que no esperará a que se ejecuten sus comandos.
fuente
La respuesta aquí ( https://stackoverflow.com/a/2732991/4752883 ) funciona muy bien si está intentando ejecutar un script en una máquina Linux remota usando
plink
ossh
. Funcionará si el script tiene varias líneaslinux
.** Sin embargo, si está intentando ejecutar un script por lotes ubicado en una
linux/windows
máquina local y su máquina remota lo estáWindows
, y consta de varias líneas usando **plink root@MachineB -m local_script.bat
No funcionará.
Solo se ejecutará la primera línea del script. Esto es probablemente una limitación de
plink
.Solución 1:
Para ejecutar un script por lotes multilínea (especialmente si es relativamente simple, que consta de unas pocas líneas):
Si su secuencia de comandos por lotes original es la siguiente
puede combinar las líneas juntas usando el separador "&&" de la siguiente manera en su
local_script.bat
archivo de la siguiente manera https://stackoverflow.com/a/8055390/4752883 :Después de este cambio, puede ejecutar el script como se indica aquí por @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883
Solución 2:
Si su secuencia de comandos por lotes es relativamente complicada, puede ser mejor utilizar una secuencia de comandos por lotes que encapsule el comando plink, así como sigue, como se indica aquí por @Martin https://stackoverflow.com/a/32196999/4752883 :
fuente
¿Por qué no simplemente copiar primero el script y luego ejecutarlo?
Por supuesto, debe tener cuidado de no cargarlo en un lugar de escritura mundial, para que nadie más pueda manipularlo antes de ejecutarlo (posiblemente como root).
fuente
Vuelva a escribir la secuencia de comandos de manera que cada comando en ella ya tenga el prefijo ssh y un nombre de host / ip o una lista de tales se pase a la secuencia de comandos como argumento (suponiendo que tenga configurada la autenticación de clave sin contraseña / ssh-agent). Es posible que sea necesario algún trabajo para pasar correctamente los códigos de error / retorno de los comandos remotos ...
fuente
Si el script no es demasiado grande, y está usando bash o ksh ...
Tanto stdin como stdout funcionan correctamente, pero el script está limitado al tamaño del argumento (generalmente alrededor de 100k). Los argumentos del guión pueden funcionar, al final de la línea, posiblemente siguiendo un argumento "-" adicional. El "-t" para asignar una pty es opcional.
Cuidado: esto confunde bash-completar, no presionar la pestaña.
fuente