diff --git a/lib/ansible/runner/action_plugins/copy.py b/lib/ansible/runner/action_plugins/copy.py index f8fff102db..e0fcad4cfa 100644 --- a/lib/ansible/runner/action_plugins/copy.py +++ b/lib/ansible/runner/action_plugins/copy.py @@ -217,7 +217,8 @@ class ActionModule(object): if raw: # don't send down raw=no module_args.pop('raw') - module_args_tmp = "%s src=%s" % (module_args, pipes.quote(tmp_src)) + module_args_tmp = "%s src=%s original_basename=%s" % (module_args, + pipes.quote(tmp_src), pipes.quote(source_rel)) if self.runner.noop_on_check(inject): module_args_tmp = "%s CHECKMODE=True" % module_args_tmp module_return = self.runner._execute_module(conn, tmp, 'file', module_args_tmp, inject=inject, complex_args=complex_args) diff --git a/library/files/file b/library/files/file index adbc21061a..4ea527cd50 100644 --- a/library/files/file +++ b/library/files/file @@ -144,6 +144,7 @@ def main(): argument_spec = dict( state = dict(choices=['file','directory','link','hard','touch','absent'], default='file'), path = dict(aliases=['dest', 'name'], required=True), + original_basename = dict(required=False), # Internal use only, for recursive ops recurse = dict(default='no', type='bool'), force = dict(required=False,default=False,type='bool'), diff_peek = dict(default=None), @@ -179,7 +180,11 @@ def main(): src = os.path.expanduser(src) if src is not None and os.path.isdir(path) and state != "link": - params['path'] = path = os.path.join(path, os.path.basename(src)) + if params['original_basename']: + basename = params['original_basename'] + else: + basename = os.path.basename(src) + params['path'] = path = os.path.join(path, basename) file_args = module.load_file_common_arguments(params)