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