webentwicklung-frage-antwort-db.com.de

Verschieben / Umbenennen einer Datei mit einer Ansible-Task auf einem Remote-System

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-Tasks nicht verwenden und die Datei nicht vom lokalen System auf das ferne System kopieren.

175

Das Dateimodul kopiert keine Dateien auf dem fernen System. Der Parameter src wird nur vom Dateimodul beim Erstellen eines Symlinks zu einer Datei verwendet.

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:

- name: Move foo to bar
  command: mv /path/to/foo /path/to/bar

Wenn Sie Lust auf etwas haben, können Sie zuerst mit dem stat-Modul prüfen, ob foo tatsächlich existiert:

- name: stat foo
  stat: path=/path/to/foo
  register: foo_stat

- name: Move foo to bar
  command: mv /path/to/foo /path/to/bar
  when: foo_stat.stat.exists
180
Bruce P

Ab Version 2.0 können Sie in Modul kopieren den Parameter remote_src verwenden.

Wenn True, wird der Remote-/Zielcomputer für den src aufgerufen.

- name: Copy files from foo to bar
  copy: remote_src=True src=/path/to/foo dest=/path/to/bar

Wenn Sie eine Datei verschieben möchten, müssen Sie die alte Datei mit dem Dateimodul löschen

- name: Remove old files foo
  file: path=/path/to/foo state=absent

Ab Version 2.8 Kopiermodulremote_src unterstützt rekursives Kopieren.

195
Alex

Ich fand die create-Option im Befehlsmodul nützlich. Wie wäre es damit:

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar

Früher habe ich einen 2-Task-Ansatz mit stat durchgeführt, wie es Bruce P vorschlägt. Jetzt mache ich das als eine Aufgabe mit erstellt. Ich denke, das ist viel klarer.

98
Tom Ekberg

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:

- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
    archive: yes
  delegate_to: "{{ inventory_hostname }}"
7
Andrew Becker

Eine andere Möglichkeit, dies zu erreichen, ist die Verwendung von file mit state: hard.

Dies ist ein Beispiel, an dem ich arbeiten musste:

- name: Link source file to another destination
  file:
    src: /path/to/source/file
    path: /target/path/of/file
    state: hard

Nur auf localhost (OSX) getestet, sollte aber auch unter Linux funktionieren. Ich kann es nicht für Windows sagen.

Beachten Sie, dass absolute Pfade erforderlich sind. Sonst würde ich den Link nicht erstellen lassen. 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:

- name: Remove old file
  file:
    path: /path/to/source/file
    state: absent

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 Verknüpfungen zu einer Datei mit ls -l überprüfen. Die Anzahl der Hardlinks wird neben dem Modus angezeigt (z. B. rwxr-xr-x 2, wenn eine Datei 2 Links enthält).

5
martinczerwi

Bruce versuchte nicht, das Ziel anzugeben, um zu prüfen, ob die Datei verschoben werden sollte, wenn sie bereits vorhanden war. Er vergewisserte sich, dass die zu verschiebende Datei tatsächlich vorhanden war, bevor er versuchte, das MV zu starten.

Wenn Sie wie Toms Interesse haben, nur dann zu verschieben, wenn die Datei noch nicht vorhanden ist, sollten wir den Bruce-Check trotzdem in die Mischung integrieren:

- name: stat foo
  stat: path=/path/to/foo
  register: foo_stat

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar
  when: foo_stat.stat.exists
4
gkedge

So habe ich es für mich zum Laufen gebracht:

  Tasks:
  - name: checking if the file 1 exists
     stat:      
      path: /path/to/foo abc.xts
     register: stat_result

  - name: moving file 1
    command: mv /path/to/foo abc.xts /tmp
    when: stat_result.stat.exists == True

im obigen Playbook wird geprüft, ob die Datei abc.xts vorhanden ist, bevor die Datei in den Ordner tmp verschoben wird.

2
eduprado

Sie können es tun, indem Sie

Mit Ad-hoc-Befehl

ansible all -m command -a" mv /path/to/foo /path/to/bar"

Oder Sie, wenn Sie es mit Playbook tun möchten

- name: Move File foo to destination bar
  command: mv /path/to/foo /path/to/bar
0
Dev pokhariya

Dies mag wie ein Overkill erscheinen, aber wenn Sie die Verwendung des Befehlsmoduls vermeiden möchten (was ich auch tue, da es nicht idempotent ist, Befehle zu verwenden), können Sie eine Kombination aus Kopieren und Archivieren verwenden.

  1. Verwenden Sie tar, um die benötigten Dateien zu archivieren. Wenn Sie vorausdenken, ist dies tatsächlich sinnvoll. Möglicherweise möchten Sie eine Reihe von Dateien in einem bestimmten Verzeichnis. Erstellen Sie dieses Verzeichnis mit allen Dateien und archivieren Sie sie in einem tar.
  2. Verwenden Sie das Unarchive-Modul. Wenn Sie dies tun, können Sie zusammen mit dem Schlüsselwort destination: und remote_src: zunächst alle Ihre Dateien in einen temporären Ordner kopieren und dann genau dort entpacken, wo Sie möchten.
0
Mark Chassy