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

90 views
Skip to first unread message

Chris Short

unread,
Jan 3, 2015, 10:55:56 AM1/3/15
to ansible...@googlegroups.com
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:

---
- hosts: daffy
  roles:
    - common
    - pi_ddclient
  sudo: true

Here's the roles/pi_ddclient/tasks/main.yml file:

---
# Do all the ddclient things
- name: Install ddclient
  apt: name={{ item }} state=latest
  with_items:
    - ddclient

- name: Copy /etc/ddclient.conf and /etc/defaults/ddclient to server
  copy: src=roles/pi_ddclient/files/etc/ddclient.conf dest=/etc/ddclient.conf owner=root group=root mode=0600 backup=yes
  copy: src=roles/pi_ddclient/files/etc/default/ddclient dest=/etc/default/ddclient owner=root group=root mode=0600 backup=yes
  notify: restart ddclient

I should point out roles/pi_ddclient/files/etc/default/ddclient copies over just fine.

How can I debug successes in Ansible? Any thoughts on what is going wrong here?

Thank you in advance.

Greg Andrews

unread,
Jan 4, 2015, 10:52:11 AM1/4/15
to ansible...@googlegroups.com
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



--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/2d5bb1e9-8224-4afb-85f0-3536b863f980%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Chris Short

unread,
Jan 4, 2015, 7:38:34 PM1/4/15
to ansible...@googlegroups.com
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:

---
- name: Install ddclient
  apt: name={{ item }} state=latest
  with_items:
    - ddclient

- name: Copy ddclient configurations to server
  template:
    src=~/ansible/roles/pi_ddclient/templates/ddclient.conf.j2
    dest=/etc/ddclient.conf owner=root group=root mode=0600 backup=yes
- name: Copy /etc/default/ddclient to server
  template:
    src=~/ansible/roles/pi_ddclient/templates/ddclient.j2
    dest=/etc/default/ddclient owner=root group=root mode=0600 backup=yes
  notify: restart ddclient

Works fine now. Thanks for the help!

Dan Vaida

unread,
Jan 10, 2015, 1:35:35 PM1/10/15
to ansible...@googlegroups.com
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:

---
- name: Install ddclient
  apt: name={{ item }} state=latest
  with_items:
    - ddclient

- name: Copy ddclient configurations to server
  template: src={{ item.src }}.j2 dest={{ item.dest }} owner=root group=root mode=0600 backup=yes
  with_items
:
     
- { src: 'ddclient.conf', dest: '/etc/ddclient.conf' }
     
- { src: 'ddclient'        , dest: '/etc/default/ddclient' }
  notify: restart ddclient

Having thins in a role possibly called 'ddclient', you would simply call it from a playbook sitting next to the 'roles' folder.

Best,

Dan.
Reply all
Reply to author
Forward
0 new messages