If you are not familiar with modules, check out Ansible - Getting Started with Modules.
There are a number of similar (but unique) ways to copy files and directories using Ansible.
- copy can be used to copy files/directories from the Ansible system to the target systems or to copy files/directories on the target systems to some other directory on the target system (this article)
- ​get_url can be used to copy a file from a URL to the target systems (this article)
- synchronize can be used for both local and remote copies via and is based off of rsync (this article)
- Or Role Files or Role Templates can be used
In this example, the contents of the /tmp/foo directory on the control node (that's your Ansible system) will be copied to /tmp/foo on each managed node.
---
hosts: all
tasks:
- name: copy /tmp/foo
synchronize:
src: /tmp/foo
dest: /tmp/foo
...
Following are examples of how to push (upload) and pull (download) files on a remote system. Let's say you run the playbook with the --ask-pass option.
ansible-playbook rsync.yml --ask-pass
Under the hood, the sshpass and rsync commands will be used, something like this.
sshpass -d8 /usr/bin/rsync --delay-updates -F --compress --archive --out-format=<<CHANGED>>%i %n%L /tmp/foo.txt rsync://server1.example.com/tmp/
On the other hand, if passwordless SSH authentication via a public/private keypair has been setup and you run the playbook without the --ask-pass option.
ansible-playbook rsync.yml
Then only the rsync command will be used, something like this.
/usr/bin/rsync --delay-updates -F --compress --archive --out-format=<<CHANGED>>%i %n%L /tmp/foo.txt rsync://server1.example.com/tmp/
It is also noteworthy that these commands expect the rsync daemon to be installed and running on the remote system. You may need to install the rsync-daemon package.
sudo dnf install rsync-daemon
And then start and enable the rsyncd service.
sudo systemctl enable rsyncd
sudo systemctl start rsyncd
synchronize is part of the ansible.posix collection thus you will need to install the ansible.posix collection to use synchronize. Check out my article on Install a collection using the ansible-galaxy collection install command.
In this example, the /tmp/foo directory on each managed node will be copied to /tmp/foo on server1.example.com. This would be a push (upload / PUT ) operation.
---
hosts: all
tasks:
- name: push /tmp/foo on {{ inventory_hostname }} to /tmp/foo on server1.example.com
ansible.posix.synchronize:
mode: push
src: /tmp/foo
dest: rsync://server1.example.com/tmp/foo
...
In this example, the /tmp/foo directory server1.example.com will be copied to /tmp/foo on each managed node. This would be a pull (download / GET ) operation.
---
hosts: all
tasks:
- name: pull /tmp/foo from server1.example.com to /tmp/foo on {{ inventory_hostname }}
ansible.posix.synchronize:
mode: pull
src: rsync://server1.example.com/tmp/foo
dest: /tmp/foo
...
Did you find this article helpful?
If so, consider buying me a coffee over at