How to copy all childs except one in Ansible?

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.


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