diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index f9c91c4f41..0f6ed65541 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -586,8 +586,7 @@ class Runner(object): # template the source data locally try: - resultant = utils.template_from_file(utils.path_dwim(self.basedir, source), - inject, self.setup_cache, no_engine=False) + resultant = utils.template_from_file(self.basedir, source, inject, self.setup_cache) except Exception, e: result = dict(failed=True, msg=str(e)) return ReturnData(host=conn.host, comm_ok=False, result=result) diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index fefdb87df1..ee87cc7278 100644 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -265,35 +265,33 @@ def varReplace(raw, vars): return ''.join(done) -def _template(text, vars, setup_cache=None, no_engine=True): +def _template(text, vars, setup_cache=None): ''' run a text buffer through the templating engine ''' vars = vars.copy() vars['hostvars'] = setup_cache text = varReplace(unicode(text), vars) - if no_engine: - # used when processing include: directives so that Jinja is evaluated - # in a later context when more variables are available - return text - else: - template = jinja2.Template(text) - res = template.render(vars) - if text.endswith('\n') and not res.endswith('\n'): - res = res + '\n' - return res + return text -def template(text, vars, setup_cache=None, no_engine=True): +def template(text, vars, setup_cache=None): ''' run a text buffer through the templating engine until it no longer changes ''' prev_text = '' while prev_text != text: prev_text = text - text = _template(text, vars, setup_cache, no_engine) + text = _template(text, vars, setup_cache) return text -def template_from_file(path, vars, setup_cache, no_engine=True): +def template_from_file(basedir, path, vars, setup_cache): ''' run a file through the templating engine ''' - data = codecs.open(path, encoding="utf8").read() - return template(data, vars, setup_cache, no_engine=no_engine) + environment = jinja2.Environment(loader=jinja2.FileSystemLoader(basedir), trim_blocks=False) + data = codecs.open(path_dwim(basedir, path), encoding="utf8").read() + template = environment.from_string(data) + vars = vars.copy() + vars['hostvars'] = setup_cache + res = template.render(vars) + if data.endswith('\n') and not res.endswith('\n'): + res = res + '\n' + return res def parse_yaml(data): return yaml.load(data)