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 ist es, etwas zu tun, wie Sie es mit Werkzeugen wie tun würden cfengine
, aber auf einer Reihe von Maschinen, auf denen keine Agenten eingerichtet sind. Dies ist möglicherweise eine gute Technik zum Einrichten cfagent
auf einer Reihe vorhandener Remotecomputer.
ssh
configuration
bash
scripting
tremoloqui
quelle
quelle
Antworten:
Sie können ein Skript übergeben und es vorübergehend ausführen lassen, indem Sie es in eine Pipeline einfügen und eine Shell ausführen.
z.B
Natürlich
"ls -l; echo 'Hello World'"
könnte das Teil durch ein Bash-Skript ersetzt werden, das in einer Datei auf dem lokalen Computer gespeichert ist.z.B
Prost!
quelle
Es gibt verschiedene Möglichkeiten, dies zu tun.
1:
2:
3:
Nummer 3 ist mein bevorzugter Weg, es erlaubt interaktive Befehle zB
su -S service nginx restart
(Bei Verwendung von Nummer 1 wird der Rest des Skripts als Eingabe für die Kennwortfrage verwendet
su -S
.)quelle
Ich würde Pythons Stoff für diesen Zweck empfehlen:
Sie sollten in der Lage sein, die oben genannten zu verwenden, um loszulegen. Konsultieren Sie die ausgezeichnete Dokumentation von Fabric , um den Rest zu erledigen. Als Ergänzung ist es durchaus möglich, Ihr Skript vollständig in Fabric zu schreiben - es ist kein Kopieren erforderlich. Es ist jedoch zu beachten, dass Sie zum Ändern des Skripts auf allen Computern 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, auf dem es derzeit ausgeführt wird, und / oder anderen Variablen ändern. Es ist eine Art pythonischer Expect.
quelle
run
undsudo
) umgeschrieben wird, nicht einmal benötigt wird.Genau dafür wird Ansible verwendet. Es gibt keinen Agenten, Sie müssen lediglich eine Textdatei mit dem Namen erstellen:
mit Inhalten, die ungefähr so aussehen:
Dies würde angeben, dass sich die Maschinen "web1, web2 ... web8" in der Gruppe "webhosts" befinden. Dann können Sie Dinge tun wie:
Starten Sie den Apache2-Dienst auf allen Ihren Computern mit sudo neu.
Sie können im laufenden Betrieb folgende Befehle ausführen:
Oder Sie können ein lokales Skript auf dem Remote-Computer ausführen:
Sie können auch ein Playbook mit einer vollständigen Konfiguration erstellen (Details finden Sie in der Dokumentation), mit der Ihre Server kompatibel sein sollen, und es bereitstellen:
Grundsätzlich können Sie es als Befehlszeilentool zum Ausführen von Befehlen auf mehreren Servern verwenden und seine Verwendung nach Belieben zu einem vollständigen Konfigurationstool erweitern.
quelle
ansible webhosts -m script script.sh
Wie in dieser Antwort erklärt , können Sie heredoc verwenden :
Mit heredoc muss man vorsichtig sein, da es nur Text sendet, aber nicht wirklich auf die Antwort wartet. Das heißt, es wird nicht auf die Ausführung Ihrer Befehle warten.
quelle
Die Antwort hier ( https://stackoverflow.com/a/2732991/4752883 ) funktioniert hervorragend, wenn Sie versuchen, ein Skript auf einem entfernten Linux-Computer mit
plink
oder auszuführenssh
. Es funktioniert, wenn das Skript mehrere Zeilen enthältlinux
.** Wenn Sie jedoch versuchen, ein Batch-Skript auszuführen, das sich auf einem lokalen
linux/windows
Computer befindet und sich auf Ihrem Remotecomputer befindetWindows
und aus mehreren Zeilen besteht, die Folgendes verwenden: **plink root@MachineB -m local_script.bat
es wird nicht funktionieren.
Nur die erste Zeile des Skripts wird ausgeführt. Dies ist wahrscheinlich eine Einschränkung von
plink
.Lösung 1:
So führen Sie ein mehrzeiliges Stapelskript aus (insbesondere, wenn es relativ einfach ist und aus wenigen Zeilen besteht):
Wenn Ihr ursprüngliches Stapelskript wie folgt lautet
Sie können die Zeilen mithilfe des Trennzeichens "&&" wie folgt in Ihrer
local_script.bat
Datei kombinieren : https://stackoverflow.com/a/8055390/4752883 :Nach dieser Änderung können Sie das Skript wie hier von @ JasonR.Coombs beschrieben ausführen: https://stackoverflow.com/a/2732991/4752883
Lösung 2:
Wenn Ihr Stapelskript relativ kompliziert ist, ist es möglicherweise besser, ein Stapelskript zu verwenden, das den Befehl plink sowie die folgenden Elemente enthält, auf die hier von @Martin https://stackoverflow.com/a/32196999/4752883 hingewiesen wird :
quelle
Warum nicht einfach zuerst das Skript kopieren und dann ausführen?
Natürlich solltest du darauf achten, dass du es nicht an einen Ort hochlädst, an dem es für die ganze Welt beschreibbar ist, damit niemand anders damit herumspielen kann, bevor du es ausführst (möglicherweise als root).
quelle
Schreiben Sie das Skript so um, dass jedem darin enthaltenen Befehl bereits das Präfix ssh vorangestellt ist und ein Hostname / eine IP-Adresse oder eine Liste davon als Argument an das Skript übergeben wird (vorausgesetzt, Sie haben eine kennwortlose / ssh-Agent-Schlüsselauthentifizierung eingerichtet). Möglicherweise sind einige Arbeiten erforderlich, um Fehler- / Rückgabecodes von den Remotebefehlen korrekt zurückzugeben.
quelle
Wenn das Skript nicht zu groß ist und Sie bash oder ksh verwenden ...
Sowohl stdin als auch stdout funktionieren ordnungsgemäß, das Skript ist jedoch auf die Argumentgröße beschränkt (normalerweise ca. 100 KB). Argumente für das Skript funktionieren möglicherweise am Ende der Zeile, möglicherweise nach einem zusätzlichen "-" Argument. Das "-t" zum Zuweisen einer Pty ist optional.
Achtung: Dies verwirrt die Bash-Vervollständigung. Drücke nicht die Tabulatortaste.
quelle