Come faccio a eseguire uno script bash locale sulle macchine remote tramite ssh?

Sto cercando un modo per spingere la configuration da una macchina centrale a diverse macchine remote senza la necessità di installare nulla sulle macchine remote.

Lo scopo è quello di fare qualcosa di simile a quello che troverai con strumenti come la cfengine , ma su un insieme di macchine che non hanno agenti impostati. Questo potrebbe effettivamente essere una buona tecnica di creazione di cfagent su un insieme di macchine remote remote esistenti.

7 Solutions collect form web for “Come faccio a eseguire uno script bash locale sulle macchine remote tramite ssh?”

È ansible passare uno script e farlo eseguire in modo effimero pipistrandolo e eseguendo una shell.

per esempio

 echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash 

Naturalmente, la parte "ls -l; echo 'Hello World'" potrebbe essere sostituita con uno script bash memorizzato in un file sulla macchina locale.

per esempio

 cat script.sh | ssh me@myserver /bin/bash 

Saluti!

Ci sono molti modi per farlo.

1:

 ssh user@remote_server 'bash -s' < localfile 

2:

 cat localfile | ssh user@remote_server 

3:

 ssh user@remote_server "$(< localfile)" 

il numero 3 è il mio preferito, permette comandi interattivi ad esempio su -S service nginx restart

(# 1 consumerà il resto dello script come input per la domanda di password quando si utilizza su -S .)

Consiglierei il tessuto di Python per questo scopo:

 #!/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 

Devi essere in grado di utilizzare quanto sopra per iniziare. Consultare l'eccellente documentazione del tessuto per fare il resto. Come addendum, è totalmente ansible scrivere il tuo script interamente all'interno di Fabric – non è necessaria alcuna copia, però va notato che per modificare lo script su tutte le macchine, dovresti solo modificare la copia locale e ridisegnare. Inoltre, con un utilizzo poco più di base dell'API, è ansible modificare lo script in base a quale host è attualmente in esecuzione e / o altre variables. È una sorta di aspettativa pitonica.

Questo è esattamente quello per il quale è usato. Non c'è agente, devi solo creare un file di text chiamato:

 /etc/ansible/hosts 

con contenuti che sembrano qualcosa di simile:

 [webhosts] web[1-8] 

Ciò specificerebbe che le macchine "web1, web2 … web8" sono nel gruppo "webhosts". Quindi puoi fare cose come:

 ansible webhosts -m service -a "name=apache2 state=restarted" --sudo 

per riavviare il servizio apache2 su tutte le macchine, usando sudo.

È ansible eseguire i comandi fly come:

 ansible webhosts -m shell -a "df -h" 

oppure è ansible eseguire uno script locale sulla macchina remota:

 ansible webhosts -m script -a "./script.sh" 

oppure è ansible creare un playbook (consultare la documentazione per i dettagli) con una configuration completa che desideri che i server possano essere conformi e implementarli con:

 ansible-playbook webplaybook.yml 

Fondamentalmente è ansible iniziare ad utilizzarlo come strumento di row di command per eseguire comandi su più server e espandere il suo utilizzo in uno strumento di configuration completo come lo si desidera.

Come spiegato in questa risposta è ansible utilizzare l' heredoc :

 ssh user@host <<'ENDSSH' #commands to run on remote host ENDSSH 

Devi stare attenti con l'eredoc, perché invia solo text, ma non aspetta veramente la risposta. Ciò significa che non aspetterà che i tuoi comandi siano eseguiti.

Perché non copiare semplicemente lo script, quindi eseguirlo?

 scp your_script.sh the_server: ssh the_server "chmod +x your_script.sh; ./your_script.sh" 

Naturalmente dovresti stare attenti a non caricarla in un luogo scrivibile a livello mondiale, in modo che nessuno potesse risolverlo prima di eseguirlo (forse come root).

Riscrivere lo script in modo che each command in esso sia già prefisso con ssh e un hostname / ip o un elenco di tali viene passato allo script come un argomento (supponendo che sia impostata l'authentication delle chiavi password / ssh-agent). Alcuni lavori potrebbero essere necessari per passare correttamente i codici di errore / return dai comandi remoti ….

Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.