Wie kann ich in einer Aufgabe mehr als eine einzelne Datei von Ansible auf Remote-Knoten kopieren?
Ich habe versucht, die Kopiermodulzeile in meiner Aufgabe zu duplizieren, um Dateien zu definieren, aber es wird nur die erste Datei kopiert.
Wie kann ich in einer Aufgabe mehr als eine einzelne Datei von Ansible auf Remote-Knoten kopieren?
Ich habe versucht, die Kopiermodulzeile in meiner Aufgabe zu duplizieren, um Dateien zu definieren, aber es wird nur die erste Datei kopiert.
Antworten:
Sie können die with_fileglobSchleife dafür verwenden:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/filesaber ich kann es mit dieser Methode nicht zum Laufen bringen. Ich habe es versucht, with_fileglob: - /roles/db/file/* aber es wird den Weg nicht gut
- 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
destMenge als Variable zu haben? { src: 'containerizers', dest: {{ containerizers }} }.
{ src: '{{ source.var }}', dest: '{{ dest.var }}' }
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 mehr als eine Aufgabe. Eine Kopieraufgabe kann nur von einem Speicherort (einschließlich mehrerer Dateien) an einen anderen auf dem Knoten kopiert werden.
- 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 }}"
findModul nur für ansible 2.x funktioniert, aber nicht für ansible 1.x
stdout_linesim Rückgabewert angegeben haben, sie jedoch nicht für das findModul gilt. Es hat nur files, examinedund matchedals Rückgabewert. Hoffe, dass anderen helfen
findscheint nur auf das entfernte System zu schauen und erlaubt nicht, irgendetwas vom verwaltenden Knoten zu holen. Diese Antworten with_fileglobscheinen passender zu sein: stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387 .
Seit Ansible 2.5 sind die with_*Konstrukte veraltet und die loopSyntax sollte verwendet werden. Ein einfaches praktisches Beispiel:
- 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
- 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
Verwenden Sie den folgenden Quellcode, um mehrere Dateien auf Ihren Clientcomputer zu kopieren.
- 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
Hinweis:
Wenn Sie mehrere Pfade mithilfe von Variablen übergeben, dann
src: "/ root / {{item}}"
Wenn Sie den Pfad übergeben, indem Sie eine Variable für verschiedene Elemente verwenden, dann
src: "/ root / {{item.source_path}}"
copyModul ist ein falsches Tool zum Kopieren vieler Dateien und / oder Verzeichnisstrukturen. Verwenden Sie synchronizestattdessen das Modul, das rsyncals Backend verwendet wird. Allerdings muss es rsyncsowohl 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 buildVerzeichnis (mit Unterverzeichnissen) des Controllers in das /var/www/htmlVerzeichnis auf dem Zielhost:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions