diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index 07bae90879..e3deedc56a 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -335,11 +335,13 @@ class Runner(object): if not found: results=dict(failed=True, msg="could not find src in first_available_file list") return ReturnData(host=conn.host, results=results) - - if self.module_vars is not None: - inject.update(self.module_vars) + + if self.module_vars is None: + self.module_vars = {} + lookup_table = self.module_vars.copy() + lookup_table.update(inject) - source = utils.template(source, inject) + source = utils.template(source, lookup_table) source = utils.path_dwim(self.basedir, source) local_md5 = utils.md5(source) @@ -361,7 +363,7 @@ class Runner(object): # run the copy module args = "src=%s dest=%s" % (tmp_src, dest) - exec_rc = self._execute_module(conn, tmp, module, args, inject=inject) + exec_rc = self._execute_module(conn, tmp, module, args, inject=lookup_table) else: # no need to transfer the file, already correct md5 result = dict(changed=False, md5sum=remote_md5, transferred=False) @@ -440,7 +442,6 @@ class Runner(object): options = utils.parse_kv(self.module_args) source = options.get('src', None) dest = options.get('dest', None) - metadata = options.get('metadata', None) if (source is None and 'first_available_file' not in self.module_vars) or dest is None: result = dict(failed=True, msg="src and dest are required") return ReturnData(host=conn.host, comm_ok=False, result=result) @@ -459,17 +460,19 @@ class Runner(object): result = dict(failed=True, msg="could not find src in first_available_file list") return ReturnData(host=conn.host, comm_ok=False, result=result) - if self.module_vars is not None: - inject.update(self.module_vars) + if self.module_vars is None: + self.module_vars = {} + lookup_table = self.module_vars.copy() + lookup_table.update(inject) - source = utils.template(source, inject) + source = utils.template(source, lookup_table) # install the template module copy_module = self._transfer_module(conn, tmp, 'copy') # template the source data locally try: - resultant = utils.template_from_file(self.basedir, source, inject) + resultant = utils.template_from_file(self.basedir, source, lookup_table) except Exception, e: result = dict(failed=True, msg=str(e)) return ReturnData(host=conn.host, comm_ok=False, result=result) @@ -478,7 +481,7 @@ class Runner(object): # run the COPY module args = "src=%s dest=%s" % (xfered, dest) - exec_rc = self._execute_module(conn, tmp, copy_module, args, inject=inject) + exec_rc = self._execute_module(conn, tmp, copy_module, args, inject=lookup_table) # modify file attribs if needed if exec_rc.is_successful(): diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index 8220a5d20b..89f1fa7cc5 100644 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -211,9 +211,7 @@ def template_from_file(basedir, path, vars): environment = jinja2.Environment(loader=jinja2.FileSystemLoader(basedir), trim_blocks=False) data = codecs.open(path_dwim(basedir, path), encoding="utf8").read() t = environment.from_string(data) - # FIXME: possibly a bit inefficient here, do this in runner code vars = vars.copy() - vars['hostvars'] = vars.get('setup_cache',{}) res = t.render(vars) if data.endswith('\n') and not res.endswith('\n'): res = res + '\n'