Wie ist es möglich, eine Datei / ein Verzeichnis mit einem Ansible-Modul auf einem Remote-System zu verschieben / umzubenennen? Ich möchte die Befehls- / Shell-Aufgaben nicht verwenden und die Datei nicht vom lokalen System auf das Remote-System kopieren.
202
Antworten:
Das Dateimodul kopiert keine Dateien auf dem Remote-System. Der Parameter src wird vom Dateimodul nur verwendet, wenn ein Symlink zu einer Datei erstellt wird.
Wenn Sie eine Datei vollständig auf einem Remote-System verschieben / umbenennen möchten, verwenden Sie am besten das Befehlsmodul, um einfach den entsprechenden Befehl aufzurufen:
Wenn Sie Lust haben, können Sie zuerst das stat-Modul verwenden, um zu überprüfen, ob foo tatsächlich existiert:
quelle
removes
Option für dascommand
Modul ( hier dokumentiert ) nicht zu verwenden? Es scheint, dass diese Option Ansible zuerst prüfen lassen würde.removes: /path/to/foo
und verwendencreates: /path/to/bar
. @Fonant hat dies bereits als Kommentar zu einer anderen Antwort erwähnt, aber da dies die akzeptierte ist, möchte ich noch einmal darauf hinweisen.Ab Version 2.0 , in Kopiermodul können Sie verwenden
remote_src
Parameter.Wenn
True
es für den src an den Remote- / Zielcomputer geht.Wenn Sie eine Datei verschieben möchten, müssen Sie die alte Datei mit dem Dateimodul löschen
Ab Version 2.8 Kopiermodul
remote_src
unterstützt rekursive Kopieren.quelle
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Ich habe die Option "Erstellen" im Befehlsmodul als nützlich empfunden. Wie wäre es damit:
Früher habe ich einen 2-Aufgaben-Ansatz mit stat durchgeführt, wie Bruce P vorschlägt. Jetzt mache ich das als eine Aufgabe mit erstellt. Ich denke, das ist viel klarer.
quelle
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Eine andere Option, die für mich gut funktioniert hat, ist die Verwendung des Synchronisierungsmoduls . Entfernen Sie dann das ursprüngliche Verzeichnis mit dem Dateimodul.
Hier ist ein Beispiel aus den Dokumenten:
quelle
dest
über SSH zugegriffen wird, auch wenn sich das Verzeichnis auf demselben Computer befindet.Eine andere Möglichkeit, dies zu erreichen, ist die Verwendung
file
mitstate: hard
.Dies ist ein Beispiel, an dem ich arbeiten musste:
Nur unter localhost (OSX) getestet, sollte aber auch unter Linux funktionieren. Ich kann nicht für Windows sagen.
Beachten Sie, dass absolute Pfade benötigt werden. Sonst würde ich den Link nicht erstellen können. Außerdem können Sie keine Dateisysteme überqueren, sodass die Arbeit mit bereitgestellten Medien möglicherweise fehlschlägt.
Der Hardlink ist dem Verschieben sehr ähnlich, wenn Sie die Quelldatei anschließend entfernen:
Ein weiterer Vorteil ist, dass Änderungen beibehalten werden, wenn Sie sich mitten in einem Spiel befinden. Wenn also jemand die Quelle ändert, wird jede Änderung in der Zieldatei wiedergegeben.
Sie können die Anzahl der Links zu einer Datei über überprüfen
ls -l
. Die Anzahl der Hardlinks wird neben dem Modus angezeigt (z. B. rwxr-xr-x 2, wenn eine Datei 2 Links enthält).quelle
Bruce versuchte nicht, das Ziel anzugeben, um zu überprüfen, ob die Datei verschoben werden sollte, wenn sie bereits vorhanden war. Er stellte sicher, dass die zu verschiebende Datei tatsächlich vorhanden war, bevor er den MV versuchte.
Wenn Sie wie Tom daran interessiert sind, sich nur zu bewegen, wenn die Datei noch nicht vorhanden ist, sollten wir Bruce's Check trotzdem in den Mix integrieren:
quelle
So habe ich es für mich zum Laufen gebracht:
Im obigen Playbook wird überprüft, ob die Datei abc.xts vorhanden ist, bevor die Datei in den Ordner tmp verschoben wird.
quelle
when: stat_result.stat.exists == True
. Nur zu benutzenwhen: stat_result.stat.exists
ist gut genug.== True
weil ich immer etwas mache, wenn die Datei nicht gefunden wird oder== False
.stat
Moduleigenschaft wirdexists
einboolean
Wert zurückgegeben. Wenn Sie also nur setzenwhen: stat_result.stat.exists
, erfüllt dies die Bedingung, wenn die Datei vorhanden ist, die ebenfalls identisch ist,when: stat_result.stat.exists == True
jedoch mehr Texte und eine unnötige bedingte Prüfung enthält.Dies mag wie ein Overkill erscheinen, aber wenn Sie die Verwendung des Befehlsmoduls vermeiden möchten (was ich tue, weil die Verwendung des Befehls nicht idempotent ist), können Sie eine Kombination aus Kopieren und Nichtarchivieren verwenden.
quelle
Sie können es tun, indem Sie -
Verwenden des Ad-hoc-Befehls
Oder Sie, wenn Sie es mit Playbook tun möchten
quelle
Ich weiß , es ist ein JAHR altes Thema ist, aber ich war frustriert und habe mir eine Rolle aufgebaut, um genau dies für eine beliebige Liste von Dateien zu tun. Verlängern Sie nach Belieben:
main.yml
move.yml
Beachten Sie, dass eine harte Verknüpfung dem Kopieren hier vorzuziehen ist, da dadurch die Eigentumsrechte und Berechtigungen von Natur aus erhalten bleiben (zusätzlich dazu, dass nicht mehr Speicherplatz für eine zweite Kopie der Datei benötigt wird).
quelle
Unter Windows:
- name: Move old folder to backup win_command: "cmd.exe /c move /Y {{ sourcePath }} {{ destinationFolderPath }}"
Verwenden Sie zum Umbenennen stattdessen den Befehl rename oder ren
quelle