web-dev-qa-db-fra.com

Copier plusieurs fichiers avec Ansible

Comment copier plus d'un fichier dans des nœuds distants avec Ansible dans une tâche?

J'ai essayé de dupliquer la ligne du module de copie dans ma tâche pour définir des fichiers, mais cela ne fait que copier le premier fichier.

63
Mark

Vous pouvez utiliser la boucle with_fileglob pour cela:

- 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

Vous pouvez utiliser with_together à cette fin:

- 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

Si vous avez besoin de plusieurs sites, vous avez besoin de plusieurs tâches. Une tâche de copie ne peut copier qu'un emplacement (y compris plusieurs fichiers) vers un autre emplacement sur le nœud.

- 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
Fredric Andersson

Ou vous pouvez utiliser with_items:

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

Le module copy est un outil inapproprié pour copier de nombreux fichiers et/ou la structure de répertoires. Utilisez plutôt le module synchronize, qui utilise rsync comme moteur. Remarquez que rsync doit être installé sur le contrôleur et l’hôte cible. C'est vraiment puissant, vérifiez documentation ansible

Exemple - Copiez les fichiers du répertoire build (avec les sous-répertoires) du contrôleur dans le répertoire /var/www/html sur l'hôte cible:

synchronize:
  src: ./my-static-web-page/build/
  dest: /var/www/html
  rsync_opts:
    - "--chmod=D2755,F644" # copy from windows - force permissions
0
mrówa