# Using module.is\_executable(path) results in an exception

**URL:** <https://forum.ansible.com/t/using-module-is-executable-path-results-in-an-exception/23465>\
**Category:** Ansible Project\
**Created:** [January 16, 2017, 4:00pm UTC](https://forum.ansible.com/t/using-module-is-executable-path-results-in-an-exception/23465 "2017-01-16T16:00:18Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![ER1](https://avatars.discourse-cdn.com/v4/letter/e/ecc23a/32.png) [@ER1](https://forum.ansible.com/u/ER1)\
**Post date:** [January 16, 2017, 4:00pm UTC](https://forum.ansible.com/t/using-module-is-executable-path-results-in-an-exception/23465/1 "2017-01-16T16:00:18Z")

</div>

I am trying to develop a new module for Ansible. I need to validate a provided parameter points to a valid executable on the system. I am having problems using the is\_executable helper function from Ansible module\_utils.

My code looks like follows:

\<playbook\_path\>/library/test\_module.py

#!/usr/bin/python

from ansible.module\_utils.basic import \*

def validate\_input(module):  
params = module.params

if not module.is\_executable(params[‘api\_bin’]):  
module.fail\_json(msg=“Please specify a valid api\_bin.”)

def main():  
fields = dict(  
api\_bin = dict(default=‘/bin/echo’)  
)

module = AnsibleModule(  
argument\_spec = fields  
)

validate\_input(module)

module.exit\_json(dict(foo=‘bar’))

if **name** == ‘ **main** ’:  
main()

\<playbook\_path\>/playbook.yml

- name: test api module  
hosts: localhost  
tasks:
- test\_module:

Very Verbose Output:

[root@wks test]# ansible-playbook playbook.yml -vvv  
Using /etc/ansible/ansible.cfg as config file  
[WARNING]: provided hosts list is empty, only localhost is available

PLAYBOOK: playbook.yml \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
1 plays in playbook.yml

PLAY [test api module] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

TASK [setup] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
Using module file /usr/lib/python2.6/site-packages/ansible/modules/core/system/setup.py  
\<127.0.0.1\> ESTABLISH LOCAL CONNECTION FOR USER: root  
\<127.0.0.1\> EXEC /bin/sh -c ‘( umask 77 && mkdir -p “`echo $HOME/.ansible/tmp/ansible-tmp-1484582250.29-253240644016022`” && echo ansible-tmp-1484582250.29-253240644016022=“`echo $HOME/.ansible/tmp/ansible-tmp-1484582250.29-253240644016022`” ) && sleep 0’  
\<127.0.0.1\> PUT /tmp/tmps9OBmS TO /root/.ansible/tmp/ansible-tmp-1484582250.29-253240644016022/setup.py  
\<127.0.0.1\> EXEC /bin/sh -c ‘chmod u+x /root/.ansible/tmp/ansible-tmp-1484582250.29-253240644016022/ /root/.ansible/tmp/ansible-tmp-1484582250.29-253240644016022/setup.py && sleep 0’  
\<127.0.0.1\> EXEC /bin/sh -c ‘/usr/bin/python2.6 /root/.ansible/tmp/ansible-tmp-1484582250.29-253240644016022/setup.py; rm -rf “/root/.ansible/tmp/ansible-tmp-1484582250.29-253240644016022/” \> /dev/null 2\>&1 && sleep 0’  
ok: [localhost]

TASK [test\_module] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
task path: /root/test/playbook.yml:4  
Using module file /root/test/library/test\_module.py  
\<127.0.0.1\> ESTABLISH LOCAL CONNECTION FOR USER: root  
\<127.0.0.1\> EXEC /bin/sh -c ‘( umask 77 && mkdir -p “`echo $HOME/.ansible/tmp/ansible-tmp-1484582250.69-169598441928985`” && echo ansible-tmp-1484582250.69-169598441928985=“`echo $HOME/.ansible/tmp/ansible-tmp-1484582250.69-169598441928985`” ) && sleep 0’  
\<127.0.0.1\> PUT /tmp/tmps9OBmS TO /root/.ansible/tmp/ansible-tmp-1484582250.69-169598441928985/test\_module.py  
\<127.0.0.1\> EXEC /bin/sh -c ‘chmod u+x /root/.ansible/tmp/ansible-tmp-1484582250.69-169598441928985/ /root/.ansible/tmp/ansible-tmp-1484582250.69-169598441928985/test\_module.py && sleep 0’  
\<127.0.0.1\> EXEC /bin/sh -c ‘/usr/bin/python2.6 /root/.ansible/tmp/ansible-tmp-1484582250.69-169598441928985/test\_module.py; rm -rf “/root/.ansible/tmp/ansible-tmp-1484582250.69-169598441928985/” \> /dev/null 2\>&1 && sleep 0’  
An exception occurred during task execution. The full traceback is:  
Traceback (most recent call last):  
File “/tmp/ansible\_lQYk0L/ansible\_module\_test\_module.py”, line 24, in   
main()  
File “/tmp/ansible\_lQYk0L/ansible\_module\_test\_module.py”, line 19, in main  
validate\_input(module)  
File “/tmp/ansible\_lQYk0L/ansible\_module\_test\_module.py”, line 7, in validate\_input  
if not module.is\_executable(params[‘api\_bin’]):  
TypeError: is\_executable() takes exactly 1 argument (2 given)

fatal: [localhost]: FAILED! =\> {  
“changed”: false,  
“failed”: true,  
“invocation”: {  
“module\_name”: “test\_module”  
},  
“module\_stderr”: “Traceback (most recent call last):\n File "/tmp/ansible\_lQYk0L/ansible\_module\_test\_module.py", line 24, in \n main()\n File "/tmp/ansible\_lQYk0L/ansible\_module\_test\_module.py", line 19, in main\n validate\_input(module)\n File "/tmp/ansible\_lQYk0L/ansible\_module\_test\_module.py", line 7, in validate\_input\n if not module.is\_executable(params[‘api\_bin’]):\nTypeError: is\_executable() takes exactly 1 argument (2 given)\n”,  
“module\_stdout”: “”,  
“msg”: “MODULE FAILURE”  
}  
to retry, use: --limit @/root/test/playbook.retry

PLAY RECAP \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
localhost : ok=1 changed=0 unreachable=0 failed=1

---

<div class="post-metadata">

**Author:** ![sivel](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/sivel/32/1198_2.png) [@sivel](https://forum.ansible.com/u/sivel)\
**Post date:** [January 16, 2017, 5:01pm UTC](https://forum.ansible.com/t/using-module-is-executable-path-results-in-an-exception/23465/2 "2017-01-16T17:01:33Z")

</div>

This is due to `is_executable` not being an instance method. Instead of using `module.is_executable`, just try `is_executable`, removing `module.` from the front.

`is_executable` is now a top level function in `ansible.module_utils.basic`, so you have already imported it.
