143 votes

Copier plusieurs fichiers avec Ansible

Comment puis-je copier plus d'un seul fichier dans des nœuds distants par Ansible dans une tâche ?

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

167voto

Arbab Nazar Points 10119

Vous pouvez utiliser le with_fileglob boucle pour cela :

- copy:
    src: "{{ item }}"
    dest: /etc/fooapp/
    owner: root
    mode: 600
  with_fileglob:
    - /playbooks/files/fooapp/*

5 votes

Cette approche pourrait m'aider si j'ai placé tous mes fichiers dans le même Root pour les copier sur la machine distante, mais qu'en est-il d'avoir certains fichiers dans différents répertoires ? Par exemple, je veux copier 3 fichiers de 3 répertoires différents

0 votes

Hé, j'essaie de déplacer tous les fichiers de mon /roles/db/files mais je n'arrive pas à le faire fonctionner avec cette méthode. J'ai essayé with_fileglob: - /roles/db/file/* mais il ne trouvera pas le chemin

1 votes

Le gros inconvénient de cette méthode est qu'elle aplatit la structure du répertoire.

157voto

guenhter Points 4460
- 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

0 votes

Est-il possible d'avoir cette solution avec le dest comme une variable ? { src: 'containerizers', dest: {{ containerizers }} } .

2 votes

@Gesias, oui. En fait, les deux côtés peuvent être des variables : { src: '{{ source.var }}', dest: '{{ dest.var }}' }

18voto

Mircea Husz Points 129

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/' ]

1 votes

Bien que cela fonctionne, ce n'est pas sémantiquement propre - il existe des options plus propres.

14voto

el_wichtel Points 764

Si vous avez besoin de plus d'un emplacement, vous avez besoin de plus d'une tâche. Une tâche de copie ne peut copier que d'un emplacement (y compris plusieurs fichiers) vers un autre 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/*

0 votes

- nom : copie fichier1 copie : src=/file1 dest=/destination/file1 - nom : copie fichier2 copie : src=/file2 dest=/destination/file2

0 votes

Ça dépend. Plus simple et probablement plus propre, mais peut être fait en utilisant des structures de données plus complexes, comme une liste de dictionnaires anonymes avec des données source et cible, bouclée avec_items. C'est la même chose dans n'importe quel langage - vous devez faire un choix. Il y a des cas où une fonction de délégation est plus efficace et plus facile à maintenir qu'une longue série d'instructions if copiées/collées. Je suis ce monstre qui préfère maintenir un bout de code concis et bien structuré plutôt qu'une longue et fastidieuse liste de directives presque identiques, mais je ne suppose pas que tout le monde soit d'accord. Faites ce qui est maintenable pour vous.

10voto

- 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 }}"

0 votes

Juste une note complémentaire que find le module ne fonctionne que pour ansible 2.x mais pas pour ansible 1.x

0 votes

J'ai corrigé votre réponse parce que vous avez mentionné la stdout_lines dans la valeur de retour mais n'est pas applicable pour find module. Il n'a que files , examined et matched comme valeurs de retour. J'espère que cela aidera d'autres personnes

2 votes

Quelqu'un a-t-il réussi à faire fonctionner ce système pour copier des fichiers vers des nœuds distants ? find semble seulement regarder le système distant, ne permettant pas de saisir quoi que ce soit du nœud de gestion. Ces réponses, utilisant with_fileglob semble être plus approprié : stackoverflow.com/a/42290160/272387 , stackoverflow.com/a/36720342/272387 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X