From eb36ff45b9ba12424ae8c36e5ea2f49363cdcf24 Mon Sep 17 00:00:00 2001 From: Dag Wieers Date: Sun, 23 Dec 2012 22:20:34 +0100 Subject: [PATCH] Make script module use raw module so it does not require python --- lib/ansible/runner/action_plugins/script.py | 23 +++++++++++---------- library/raw | 10 ++++++++- library/script | 8 ++++--- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/lib/ansible/runner/action_plugins/script.py b/lib/ansible/runner/action_plugins/script.py index d58e09946d3..db694f829a5 100644 --- a/lib/ansible/runner/action_plugins/script.py +++ b/lib/ansible/runner/action_plugins/script.py @@ -34,9 +34,6 @@ class ActionModule(object): def run(self, conn, tmp, module_name, module_args, inject): ''' handler for file transfer operations ''' - # load up options - options = utils.parse_kv(module_args) - tokens = shlex.split(module_args) source = tokens[0] # FIXME: error handling @@ -44,8 +41,6 @@ class ActionModule(object): source = utils.template(self.runner.basedir, source, inject) source = utils.path_dwim(self.runner.basedir, source) - exec_rc = None - # transfer the file to a remote tmp location source = source.replace('\x00','') # why does this happen here? args = args.replace('\x00','') # why does this happen here? @@ -56,12 +51,18 @@ class ActionModule(object): # fix file permissions when the copy is done as a different user if self.runner.sudo and self.runner.sudo_user != 'root': - self.runner._low_level_exec_command(conn, "chmod a+r %s" % tmp_src, tmp) + prepcmd = 'chmod a+rx %s' % tmp_src + else: + prepcmd = 'chmod +x %s' % tmp_src + + # add preparation steps to one ssh roundtrip executing the script + module_args = prepcmd + '; ' + tmp_src + ' ' + args - # make executable - self.runner._low_level_exec_command(conn, "chmod +x %s" % tmp_src, tmp) + handler = utils.plugins.action_loader.get('raw', self.runner) + result = handler.run(conn, tmp, 'raw', module_args, inject) - # run it through the command module - module_args = tmp_src + " " + args + " #USE_SHELL" - return self.runner._execute_module(conn, tmp, 'command', module_args, inject=inject) + # clean up after + if tmp.find("tmp") != -1 and C.DEFAULT_KEEP_REMOTE_FILES != '1': + self.runner._low_level_exec_command(conn, 'rm -rf %s >/dev/null 2>&1' % tmp, tmp) + return result diff --git a/library/raw b/library/raw index 061d8eb066a..6e5b760fa8e 100644 --- a/library/raw +++ b/library/raw @@ -16,8 +16,16 @@ description: given to M(raw) are run directly through the configured remote shell. Standard output, error output and return code are returned when available. There is no change handler support for this module. + - This module does not require python on the remote system, much like + the M(script) module. examples: - description: Example from C(/usr/bin/ansible) to bootstrap a legacy python 2.4 host - code: ansible newhost.example.com -m raw -a "yum -y install python-simplejson" + code: "action: raw yum -y install python-simplejson" +notes: + - If you want to execute a command securely and predictably, it may be + better to use the M(command) module instead. Best practices when writing + playbooks will follow the trend of using M(command) unless M(shell) is + explicitly required. When running ad-hoc commands, use your best + judgement. author: Michael DeHaan ''' diff --git a/library/script b/library/script index 054f4a807d4..0e0b5138034 100644 --- a/library/script +++ b/library/script @@ -4,9 +4,11 @@ DOCUMENTATION = """ module: script short_description: Runs a local script on a remote node description: - - The M(script) module takes the script name followed by a list of space-delimited arguments. + - The M(script) module takes the script name followed by a list of + space-delimited arguments. - The given script will be processed through the shell environment. - - See also the M(command) and M(shell) modules. + - This module does not require python on the remote system, much like + the M(raw) module. options: free_form: description: @@ -16,7 +18,7 @@ options: aliases: [] examples: - description: "Example from Ansible Playbooks" - code: "script: /some/local/script.sh --some-arguments 1234" + code: "action: script /some/local/script.sh --some-arguments 1234" notes: - It is preferable to write Ansible modules than pushing scripts. Convert your script to an Ansible module for bonus points! author: Michael DeHaan