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_fileglob
Schleife dafür verwenden:
- copy:
src: "{{ item }}"
dest: /etc/fooapp/
owner: root
mode: 600
with_fileglob:
- /playbooks/files/fooapp/*
/roles/db/files
aber 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
dest
Menge 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 }}"
find
Modul nur für ansible 2.x funktioniert, aber nicht für ansible 1.x
stdout_lines
im Rückgabewert angegeben haben, sie jedoch nicht für das find
Modul gilt. Es hat nur files
, examined
und matched
als Rückgabewert. Hoffe, dass anderen helfen
find
scheint nur auf das entfernte System zu schauen und erlaubt nicht, irgendetwas vom verwaltenden Knoten zu holen. Diese Antworten with_fileglob
scheinen passender zu sein: stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387 .
Seit Ansible 2.5 sind die with_*
Konstrukte veraltet und die loop
Syntax 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}}"
copy
Modul ist ein falsches Tool zum Kopieren vieler Dateien und / oder Verzeichnisstrukturen. Verwenden Sie synchronize
stattdessen das Modul, das rsync
als Backend verwendet wird. Allerdings muss es 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 build
Verzeichnis (mit Unterverzeichnissen) des Controllers in das /var/www/html
Verzeichnis auf dem Zielhost:
synchronize:
src: ./my-static-web-page/build/
dest: /var/www/html
rsync_opts:
- "--chmod=D2755,F644" # copy from windows - force permissions