web-dev-qa-db-ger.com

Kopieren Sie mehrere Dateien mit Ansible

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.

63
Mark

Sie können dazu die with_fileglob-Schleife verwenden:

- copy:
    src: "{{ item }}"
    dest: /etc/fooapp/
    owner: root
    mode: 600
  with_fileglob:
    - /playbooks/files/fooapp/*
93
Arbab Nazar
- 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
73
guenhter

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/' ]
13
Mircea Husz

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/*
8
flxPeters
- 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
2

Oder Sie können with_items verwenden:

- copy:
    src: "{{ item }}"
    dest: /etc/fooapp/
    owner: root
    mode: 600
  with_items:
    - dest_dir
1
MxWild

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
0
mrówa