Ad-Hoc Works; Playbook Works. Wait... No it doesn't.

This ad-hoc command works for me:

ansible -s -m copy -a “src=roles/pi_ddclient/files/etc/ddclient.conf dest=/etc/ddclient.conf owner=root group=root mode=0600 backup=yes” daffy

However when I run the playbook containing the same command (with sudo: true specified) it does not copy the file into place (no modification to the file at all) but the play says it runs successfully!

cshort-mba:ansible oaf357$ ansible-playbook pi_ddclient.yml -s
sudo password:

PLAY [daffy] ******************************************************************

GATHERING FACTS ***************************************************************
ok: [daffy]

TASK: [common | apt-get update] ***********************************************
ok: [daffy]

TASK: [common | Installing commonly installed files] **************************
ok: [daffy] => (item=curl,host,mercurial,ntpdate,vim)

TASK: [common | Make Vim Default Editor] **************************************
changed: [daffy]

TASK: [pi_ddclient | Install ddclient] ****************************************
ok: [daffy] => (item=ddclient)

TASK: [pi_ddclient | Copy /etc/ddclient.conf and /etc/defaults/ddclient to server] ***
ok: [daffy]

PLAY RECAP ********************************************************************
daffy : ok=6 changed=1 unreachable=0 failed=0

Here’s the pi_ddclient.yml file:

I believe the primary issue is that your pi_ddclient role’s task file specifies the same path to the source file as your ad-hoc command. Your ad-hoc command doesn’t know what roles are, so it needs the path to the source file to start with “roles/pi_ddclient/files/”. However the role already knows the path to its files start that way.

Telling the role to find the file “roles/pi_ddclient/files/etc/ddclient.conf” will make it look for the file “roles/pi_ddclient/files/roles/pi_ddclient/files/etc/ddclient.conf”, which probably doesn’t exist.

In your pd_ddclient role’s tasks/main.yml file, try these “copy:” lines:

copy: src=etc/ddclient.conf dest=/etc/ddclient.conf owner=root group=root mode=0600 backup=yes
copy: src=etc/default/ddclient dest=/etc/default/ddclient owner=root group=root mode=0600 backup=yes

It seems like you can’t have multiple copy/template operations under one name. I’m not sure if this is a YAML standard or an Ansible issue. I made these files into templates and split the template operations out under two names. Now it works. A little annoying but I did realize this was a limitation when dealing with some apache configs. Here is the tasks/main.yml file now:

FWIW, the template module already knows where to look for the template files: templates/
Same concept is true for other modules like copy which looks for the files in the files/ folder.
Now, if you are willing to sacrifice the name of the task and make it a little bit more broad, you could use the template module with with_items like so:

`