Estoy buscando una manera de enviar la configuración desde 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 parecido a lo que se puede encontrar 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 para realizar la instalación cfagent
en un conjunto de máquinas remotas existentes.
Respuesta1
Puede pasar un script y hacer que se ejecute efímeramente conectándolo y ejecutando un shell.
p.ej
echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash
Naturalmente, la "ls -l; echo 'Hello World'"
pieza podría reemplazarse con un script bash almacenado en un archivo en la máquina local.
p.ej
cat script.sh | ssh me@myserver /bin/bash
¡Salud!
Respuesta2
Hay varias formas de hacerlo.
1:
ssh user@remote_server 'bash -s' < localfile
2:
cat localfile | ssh user@remote_server
3:
ssh user@remote_server "$(< localfile)"
El número 3 es mi forma preferida, permite comandos interactivos, por ejemplo.sudo -S service nginx restart
(Los números 1 y 2 consumirán el resto del script como entrada para la pregunta de contraseña cuando use sudo -S
).
Respuesta3
Recomendaría Fabric de Python para este propósito:
#!/usr/bin/python
# ~/fabfile.py
from fabric_api import *
env.hosts = ['host1', 'host2']
def deploy_script():
put('your_script.sh', 'your_script.sh', mode=0755)
sudo('./your_script.sh')
# from shell
$ fab deploy_script
Debería poder utilizar lo anterior para comenzar. Consulta la excelente teladocumentaciónpara hacer el resto. Como complemento, es totalmente posible escribir su script completamente dentro de Fabric; no es necesario copiarlo; sin embargo, debe tenerse en cuenta que para cambiar el script en todas las máquinas, solo necesitará editar la copia local y volver a implementarlo. Además, con un uso un poco más básico de la API, puede modificar el script según el host en el que se esté ejecutando actualmente y/u otras variables. Es una especie de expectativa pitónica.
Respuesta4
Como se explica enesta respuestapuedes usarheredoc:
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
Hay que 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.