Ich muss die Datei von Maschine A auf Maschine B kopieren, während meine Kontrollmaschine, von der aus ich alle meine ansible Aufgaben ausführe, Maschine C (lokale Maschine) ist.
Ich habe folgendes versucht:
Verwenden Sie den Befehl scp im Shell-Modul von ansible
hosts: machine2
user: user2
tasks:
- name: Copy file from machine1 to machine2
shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1
Dieser Ansatz geht einfach weiter und endet nie.
Verwenden Sie Fetch & Copy-Module
hosts: machine1
user: user1
tasks:
- name: copy file from machine1 to local
fetch: src=/path-of-file/file1 dest=/path-of-file/file1
hosts: machine2
user: user2
tasks:
- name: copy file from local to machine2
copy: src=/path-of-file/file1 dest=/path-of-file/file1
Dieser Ansatz führt zu einem Fehler wie folgt:
error while accessing the file /Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>, error was: [Errno 102] Operation not supported on socket: u'/Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>'
Anregungen wären hilfreich.
Antworten:
Um Remote-zu-Remote-Dateien zu kopieren, können Sie das Synchronisierungsmodul mit
delegate_to: source-server
dem Schlüsselwort ' ' verwenden:Dieses Playbook kann von Ihrem Computer aus ausgeführt werden.
quelle
config.ssh.insert_key = false
Vagrant- Datei ein , um Vagrant zu zwingen, den EINEN unsicheren_Schlüssel für den Zugriff auf alle Computer zu verwenden. Aber jetzt bekomme ich sogar keine Fehlermeldung (es wartet ewig). Auch Fehler github.com/ansible/ansible/issues/7250 besagt, dass es nicht möglich ist, von Remote zu Remote zu kopieren.mode=push
(oderdelegate_to: serverB
, aber nicht beide).mode=push
sollte verwendet werden, aber in dieser Situationdelegate_to: serverB
nicht verwendet werden, da diesserverB
die Quelle und das Ziel machen würde .Wie bereits von ant31 erwähnt, können Sie das
synchronize
Modul dazu verwenden. Standardmäßig überträgt das Modul Dateien zwischen dem Steuergerät und dem aktuellen Remote-Host (inventory_host
).delegate_to
Diese können jedoch mithilfe des Task- Parameters geändert werden (es ist wichtig zu beachten, dass dies ein Parameter der Task und nicht des Moduls ist).Sie können die Aufgabe entweder auf
ServerA
oder platzierenServerB
, müssen jedoch die Übertragungsrichtung entsprechend anpassen (mit demmode
Parameter vonsynchronize
).Aufgabe aufsetzen
ServerB
Dies verwendet die Standardeinstellung
mode: push
, sodass die Datei vom delegate (ServerA
) auf die aktuelle remote (ServerB
) übertragen wird.Dies mag seltsam klingen, da die Aufgabe aktiviert wurde
ServerB
(viahosts: ServerB
) gestellt wurde. Es ist jedoch zu beachten, dass die Aufgabe tatsächlich auf dem delegierten Host ausgeführt wird , in diesem FallServerA
. Das Drücken (vonServerA
nachServerB
) ist also in der Tat die richtige Richtung. Denken Sie auch daran, dass wir uns nicht einfach dafür entscheiden können, überhaupt nicht zu delegieren, da dies bedeuten würde, dass die Übertragung zwischen der Steuerungsmaschine und erfolgtServerB
.Aufgabe aufsetzen
ServerA
Dies verwendet
mode: pull
, um die Übertragungsrichtung umzukehren. Denken Sie auch hier daran, dass die Aufgabe tatsächlich ausgeführt wirdServerB
, sodass das Ziehen die richtige Wahl ist.quelle
Warning: Identity file /Users/myuser/.ssh/id_servers not accessible
.Ich konnte dies mit local_action lösen, um von Maschine A nach Maschine C zu scp und dann die Datei nach Maschine B zu kopieren.
quelle
Wenn Sie Dateien zwischen zwei Remote-Knoten über ansible synchronisieren müssen, können Sie Folgendes verwenden:
Wenn
remote_server
diese Option aktiviert ist, müssen Sie rsync im Dämonmodus starten. Einfaches Beispiel:quelle
Eine einfache Möglichkeit, das Kopiermodul zum Übertragen der Datei von einem Server auf einen anderen zu verwenden
Hier ist ein Spielbuch
quelle
Wenn Sie rsync ausführen und einen benutzerdefinierten Benutzer und einen benutzerdefinierten ssh-Schlüssel verwenden möchten, müssen Sie diesen Schlüssel in die rsync-Optionen schreiben.
quelle
Sie können auch verwenden
deletgate
mitscp
:Aufgrund des
delegate
Befehls wird auf dem anderen Server ausgeführt und es istscp
die Datei für sich.quelle