I have used a similar playbook which works as expected:
# playbook.yml
---
- hosts: ${target}
sudo: yes
tasks:
- name: Copy file
copy: src=../files/test.py dest=/opt/test.py owner=howardsandford group=admin mode=755
- name: Execute script
command: /opt/test.py
And test.py:
#!/usr/bin/python
# write to a file
f = open('/tmp/test_from_python','w')
f.write('hi there\n')
Running the playboook:
ansible-playbook playbook.yml --extra-vars "target=the_host_to_run_script_on"
Shows:
PLAY [the_host_to_run_script_on] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [the_host_to_run_script_on]
TASK: [Copy file] *************************************************************
changed: [the_host_to_run_script_on]
TASK: [Execute script] ********************************************************
changed: [the_host_to_run_script_on]
PLAY RECAP ********************************************************************
the_host_to_run_script_on : ok=3 changed=2 unreachable=0 failed=0
And on the remote host:
$ cat /tmp/test_from_python
hi there
Several differences between our setup:
- I don't have single quotes around the copy and command parameters
- The shebang sets the python interpreter rather than specifying /usr/bin/python from the command line
- I set the owner of the script to my own username and primary group that is in sudoers, rather than root
Hopefully this can point you in the right direction of where the differences might be.
mode=755
was the problem here, as the value is interpreted as decimal not octal. Usingmode="0755"
would probably work. The file module documentation covers this but should really have a warning with highlighted text.