So holen Sie mit Ansible mehrere Dateien von einem entfernten Rechner auf einen lokalen

17

Ich möchte mit Ansible Dateien vom Remote-Verzeichnis in das lokale Verzeichnis kopieren, aber mit dem Fetch-Modul kann ich nur eine Datei kopieren. Ich habe viele Server, von denen ich Dateien benötige (auf jedem Server dasselbe Verzeichnis), und ich weiß jetzt nicht, wie ich das mit Ansible machen soll.

Irgendwelche Ideen?

Maayke
quelle

Antworten:

22

Sie müssen wahrscheinlich Remote-Inhalte registrieren und dann eine Schleife darüber durchführen. So sollte es funktionieren:

- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
  register: files_to_copy

- fetch: src=/remote/{{ item }} dest=/local/
  with_items: "{{ files_to_copy.stdout_lines }}"

Wo /remotesollte mit Verzeichnispfad auf Ihrem Remote-Server und /local/mit Verzeichnis auf Ihrem Master geändert werden

Kęstutis
quelle
1
Übrigens geht dies nur eine Ebene tief (ohne Unterverzeichnisse) und ignoriert Verzeichnisse im Allgemeinen. Wenn Sie dies nicht wünschen, ändern Sie einfach den Shell-Befehl entsprechend.
Kęstutis
Was passiert, wenn ich auf mehreren Servern arbeite? Wird jeder seine eigenen Erkenntnisse registrieren? und die richtigen holen?
Amir Mehler
Hast du eine Ahnung, wie das mit win_find geht? Ich kann aus der zurückgegebenen Dateiliste nicht herausfinden, wie ein zusätzlicher Pfad erstellt wird
Peter Kahn,
27

Verwenden Sie dazu das Synchronisierungsmodul . Dies nutzt die unglaubliche Leistung von rsync . Es kopiert Datei- und Verzeichnisstrukturen beliebiger Tiefe, ist kugelsicher und äußerst effizient - es kopiert nur die tatsächlich geänderten Bytes:

- name: Fetch stuff from the remote and save to local
  synchronize:  src={{ item }} dest=/tmp/ mode=pull
  with_items:
    - "folder/one"
    - "folder/two"

Der Schlüssel ist der modeParameter:

Geben Sie die Richtung der Synchronisation an. Im Push-Modus ist der Localhost oder Delegate die Quelle. Im Pull-Modus ist der Remote-Host im Kontext die Quelle.

Duncan Lock
quelle
1
Ich habe festgestellt, dass das synchroniseModul viel zuverlässiger und skalierbarer ist als die anderen Methoden, mit denen ansible Dateien kopieren muss.
Küken
3
Dies ist definitiv ein besserer Weg, als die akzeptierte Antwort.
Childofsoong
5

Ich habe nicht genug Repräsentanten, um zu kommentieren, sonst würde ich es hinzufügen.

Ich habe das verwendet, was Kęstutis gepostet hat. Ich musste eine kleine Modifikation vornehmen

- shell: (cd /remote; find . -maxdepth 1 -type f) | cut -d'/' -f2
  register: files_to_copy

- fetch: src=/remote/{{ item }} dest=/local/
  with_items: "{{ files_to_copy.stdout_lines }}"

Das with_items war der Bereich, den ich ändern musste. Andernfalls konnten die Dateien nicht gefunden werden.

JamStar
quelle
2

Behebung des obigen Beispiels

- hosts: srv-test
  tasks:
    - find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
      register: files_to_copy
    - fetch: src={{ item.path }} dest=/tmp
      with_items: "{{ files_to_copy.files }}"
Marketta
quelle
1

Wenn Sie die neueste ansible-Version wie 2.2.1.0 verwenden, brauchen wir wahrscheinlich Anführungszeichen für den Artikel

- name: use find to get the files list which you want to copy/fetch
  find: 
    paths: /etc/
    patterns: ".*passwd$"
    use_regex: True   
  register: file_2_fetch

- name: use fetch to get the files
  fetch:
    src: "{{ item.path }}"
    dest: /tmp/
    flat: yes
  with_items: "{{ file_2_fetch.files }}"
Z.Liu
quelle
0
- hosts: srv-test
  tasks:
    - find: paths="/var/tmp/collect" recurse=no patterns="*.tar"
      register: file_to_copy
    - fetch: src={{ item }} dest=/tmp
      with_items: files_to_copy.stdout_lines
Diego Roberto Dos Santos
quelle
Das geht gar nicht. Wurde das versucht?
Basil A
0

Ich benutze dies: 1. Ziehen Sie Verzeichnisse vom Remote-Host auf bestimmte Hosts

- name: Gather hosts stats from other hosts
  shell: " scp -r {{results_root_dir_src}} root@{{groups['profiling_server'][0]}}:{{results_root_dir_dest}}/abc/"
  when: "'profiling_server' not in group_names"
#It will not run on the node where the directories need to be copied.
  1. Ziehen Sie Verzeichnisse vom Knoten zum localhost
- name: Gather from host to local
  delegate_to: 127.0.0.1
  run_once: true
  become: false
  shell: "scp -r root@{{groups['profiling_server'][0]}}:{{results_root_dir}} ./results_local_location "

Inventar

[nodes]
server1
server2
server3
[profiling_server]
server1

kmajumder
quelle