13

This documentation explains how to copy files and directories using the copy module in Ansible. How to copy all childs except one?

Discussion

  1. The options do not clarify how it could be done.
  2. Copying all childs individually is not an option as the parent contains more than 100 childs.
030
  • 5,901
  • 13
  • 68
  • 110

2 Answers2

16

Best option would probably to use the synchronize module.

synchronize is a wrapper around the rsync command, meant to make common tasks with rsync easier.

Whereas the copy module copies files using Python and is limited in its functionality. There is a Note in the copy module documentation:

The “copy” module recursively copy facility does not scale to lots (>hundreds) of files. For alternative, see synchronize module, which is a wrapper around rsync.

With the synchronize module it is possible to pass exclude patterns via rsync_opts to the rsync command being executed by Ansible.

# Synchronize passing in extra rsync options
synchronize:
    src: /tmp/helloworld
    dest: /var/www/helloword
    rsync_opts:
      - "--exclude=.git"

But the synchronize module has some caveats. Like the the requirement of rsync installed on local and remote machine. That's why I wouldn't use it when not needed.

Murage
  • 107
  • 3
Henrik Pingel
  • 9,380
  • 2
  • 28
  • 39
7

If I had to use just copy, here is what I would do. In this example I am using patterns that are specific to Python and a .hiddenfile (I'm using hidden to demonstrate find has a lot of options to explore). However the basic idea - you can go wild with patterns/regex filters to meet your needs.

- name: prepare a list of files to copy from some place
  find:
    paths: /var/some-place
    hidden: yes
    patterns:
      - "*.py"
      - ".hiddenfile"
  delegate_to: localhost
  register: target_files

- name: copy files to other place
  copy:
    src: "{{ item.path }}"
    dest: /var/other-place
  with_items: "{{ target_files.files }}"
  tags:
    - copy
Krolique
  • 171
  • 1
  • 2
  • 1
    answer is awesome, worked perfectly for me. We can also exclude some files in the find module with: excludes: 'string' – pedrotester Jun 09 '18 at 15:29