Odpowiedzi:
Możesz użyć with_fileglobpętli do tego:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/filesale nie mogę uruchomić tej metody. Próbowałem, with_fileglob: - /roles/db/file/* ale to nie wystarczy
- 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
destzbiorem jako zmienną? { src: 'containerizers', dest: {{ containerizers }} }.
{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
W tym celu możesz użyć with_together:
- name: Copy multiple files to multiple directories
copy: src={{ item.0 }} dest={{ item.1 }}
with_together:
- [ 'file1', 'file2', 'file3' ]
- [ '/dir1/', '/dir2/', '/dir3/' ]
Jeśli potrzebujesz więcej niż jednej lokalizacji, potrzebujesz więcej niż jednego zadania. Jedno zadanie kopiowania można skopiować tylko z jednej lokalizacji (w tym wielu plików) do innej w węźle.
- 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/*
Od wersji Ansible 2.5 with_*konstrukcje są przestarzałe i loopnależy używać składni. Prosty praktyczny przykład:
- name: Copy CA files
copy:
src: '{{item}}'
dest: '/etc/pki/ca-trust/source/anchors'
owner: root
group: root
mode: 0644
loop:
- symantec-private.crt
- verisignclass3g2.crt
- 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 }}"
findmoduł działa tylko dla ansibl 2.x, ale nie dla ansibl 1.x
stdout_lineswartości zwracanej, ale nie ma ona zastosowania do findmodułu. To tylko files, examinedi matchedjako wartości zwracane. Mam nadzieję, że pomoże to innym
findwydaje się tylko patrzeć na system zdalny, nie pozwalając na pobranie czegokolwiek z węzła zarządzającego. Te odpowiedzi, używając with_fileglob, wydają się być bardziej odpowiednie: stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387 .
- 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
Użyj następującego kodu źródłowego do kopiowania wielu plików na komputerze klienckim.
- name: Copy data to the client machine
hosts: hostname
become_method: sudo
become_user: root
become: true
tasks:
# Copy twice as sometimes files get skipped (mostly only one file skipped from a folder if the folder does not exist)
- name: Copy UFO-Server
copy:
src: "source files path"
dest: "destination file path"
owner: root
group: root
mode: 0644
backup: yes
ignore_errors: true
Uwaga:
Jeśli przekazujesz wiele ścieżek przy użyciu zmiennej to
src: „/ root / {{item}}”
Jeśli przekazujesz ścieżkę, używając zmiennej dla różnych elementów, to
src: "/ root / {{item.source_path}}"
copymodule jest złym narzędziem do kopiowania wielu plików i / lub struktury katalogów, synchronizezamiast tego użyj modułu, który używa rsyncjako zaplecza. Pamiętaj, że wymaga rsynczainstalowania zarówno na kontrolerze, jak i na hoście docelowym. To naprawdę potężne, sprawdź dokumentację ansibli .
Przykład - skopiuj pliki z buildkatalogu (z podkatalogami) kontrolera do /var/www/htmlkatalogu na hoście docelowym:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions