Wie kann ich von Ansible in einer Aufgabe mehr als eine einzelne Datei in Remote-Knoten kopieren?
Ich habe versucht, die Kopiermodulzeile in meiner Aufgabe zu duplizieren, um Dateien zu definieren, aber es kopiert nur die erste Datei.
Sie können dazu die with_fileglob
-Schleife verwenden:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
- name: Your copy task
copy: src={{ item.src }} dest={{ item.dest }}
with_items:
- { src: 'containerizers', dest: '/etc/mesos/containerizers' }
- { src: 'another_file', dest: '/etc/somewhere' }
- { src: 'dynamic', dest: '{{ var_path }}' }
# more files here
Sie können with_together für diesen Zweck verwenden:
- name: Copy multiple files to multiple directories
copy: src={{ item.0 }} dest={{ item.1 }}
with_together:
- [ 'file1', 'file2', 'file3' ]
- [ '/dir1/', '/dir2/', '/dir3/' ]
Wenn Sie mehr als einen Standort benötigen, benötigen Sie mehrere Aufgaben. Eine Kopieraufgabe kann nur von einem Ort (einschließlich mehrerer Dateien) an einen anderen auf dem Knoten kopieren.
- copy: src=/file1 dest=/destination/file1
- copy: src=/file2 dest=/destination/file2
# copy each file over that matches the given pattern
- copy: src={{ item }} dest=/destination/
with_fileglob:
- /files/*
- hosts: lnx
tasks:
- find: paths="/appl/scripts/inq" recurse=yes patterns="inq.Linux*"
register: file_to_copy
- copy: src={{ item.path }} dest=/usr/local/sbin/
owner: root
mode: 0775
with_items: "{{ files_to_copy.files }}"
- name: find inq.Linux*
find: paths="/appl/scripts/inq" recurse=yes patterns="inq.Linux*"
register: find_files
- name: set fact
set_fact:
all_files:
- "{{ find_files.files | map(attribute='path') | list }}"
when: find_files > 0
- name: copy files
copy:
src: "{{ item }}"
dest: /destination/
with_items: "{{ all_files }}"
when: find_files > 0
Oder Sie können with_items verwenden:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_items:
- dest_dir
Das Modul copy
ist ein falsches Werkzeug zum Kopieren vieler Dateien und/oder Verzeichnisstrukturen. Verwenden Sie stattdessen das Modul synchronize
, das rsync
als Backend verwendet. Allerdings muss rsync
sowohl auf dem Controller als auch auf dem Zielhost installiert sein. Es ist wirklich mächtig, überprüfen Sie ansible Dokumentation .
Beispiel - Kopieren Sie Dateien aus dem Verzeichnis build
(mit Unterverzeichnissen) des Controllers in das Verzeichnis /var/www/html
auf dem Zielhost:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions