diff --git a/lib/ansible/runner/action_plugins/synchronize.py b/lib/ansible/runner/action_plugins/synchronize.py index 8bd0bcd0f5f..63331760e44 100644 --- a/lib/ansible/runner/action_plugins/synchronize.py +++ b/lib/ansible/runner/action_plugins/synchronize.py @@ -26,6 +26,19 @@ class ActionModule(object): def __init__(self, runner): self.runner = runner + self.inject = None + + def _get_absolute_path(self, path=None): + if 'vars' in self.inject: + if '_original_file' in self.inject['vars']: + # roles + path = utils.path_dwim_relative(self.inject['_original_file'], 'files', path, self.runner.basedir) + elif 'inventory_dir' in self.inject['vars']: + # non-roles + abs_dir = os.path.abspath(self.inject['vars']['inventory_dir']) + path = os.path.join(abs_dir, path) + + return path def _process_origin(self, host, path, user): @@ -35,6 +48,9 @@ class ActionModule(object): else: return '%s:%s' % (host, path) else: + if not ':' in path: + if not path.startswith('/'): + path = self._get_absolute_path(path=path) return path def _process_remote(self, host, path, user): @@ -48,10 +64,16 @@ class ActionModule(object): else: return_data = path + if not ':' in return_data: + if not return_data.startswith('/'): + return_data = self._get_absolute_path(path=return_data) + return return_data def setup(self, module_name, inject): ''' Always default to localhost as delegate if None defined ''' + + self.inject = inject # Store original transport and sudo values. self.original_transport = inject.get('ansible_connection', self.runner.transport) @@ -71,6 +93,8 @@ class ActionModule(object): ''' generates params and passes them on to the rsync module ''' + self.inject = inject + # load up options options = {} if complex_args: