Ich suche nach einer Möglichkeit, die Konfiguration von einem zentralen Computer auf mehrere Remotecomputer zu übertragen, ohne dass auf den Remotecomputern etwas installiert werden muss.
Das Ziel besteht darin, etwas zu tun, das Sie mit Tools wie erreichen würden cfengine
, aber auf einer Reihe von Maschinen, auf denen keine Agenten eingerichtet sind. Dies könnte tatsächlich eine gute Technik für die Einrichtung cfagent
auf einer Reihe vorhandener Remote-Maschinen sein.
Antwort1
Sie können ein Skript übergeben und es flüchtig ausführen lassen, indem Sie es weiterleiten und eine Shell ausführen.
z.B
echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash
Natürlich "ls -l; echo 'Hello World'"
könnte der Teil durch ein Bash-Skript ersetzt werden, das in einer Datei auf dem lokalen Computer gespeichert ist.
z.B
cat script.sh | ssh me@myserver /bin/bash
Prost!
Antwort2
Hierfür gibt es mehrere Möglichkeiten.
1:
ssh user@remote_server 'bash -s' < localfile
2:
cat localfile | ssh user@remote_server
3:
ssh user@remote_server "$(< localfile)"
Nummer 3 ist mein bevorzugter Weg, er ermöglicht interaktive Befehle, z. B.sudo -S service nginx restart
(#1 und #2 nutzen den Rest des Skripts als Eingabe für die Kennwortabfrage, wenn Sie verwenden sudo -S
.)
Antwort3
Ich würde für diesen Zweck Python Fabric empfehlen:
#!/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
Sie sollten in der Lage sein, die oben genannten Informationen zu verwenden, um loszulegen. Konsultieren Sie Fabrics ausgezeichneteDokumentationum den Rest zu erledigen. Als Nachtrag: Es ist durchaus möglich, Ihr Skript vollständig in Fabric zu schreiben – kein Kopieren erforderlich. Es sollte jedoch beachtet werden, dass Sie zum Ändern des Skripts auf allen Maschinen nur die lokale Kopie bearbeiten und erneut bereitstellen müssen. Darüber hinaus können Sie mit etwas mehr als der grundlegenden Verwendung der API das Skript basierend auf dem Host ändern, auf dem es derzeit ausgeführt wird, und/oder auf anderen Variablen. Es ist eine Art pythonisches Expect.
Antwort4
Wie indiese AntwortSie können verwendenhierdoc:
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
Bei heredoc muss man vorsichtig sein, denn es sendet nur Text, wartet aber nicht wirklich auf die Antwort. Das heißt, es wartet nicht auf die Ausführung Ihrer Befehle.