diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index 6867699229..f9c91c4f41 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -648,7 +648,7 @@ class Runner(object): inject.update(host_variables) inject.update(self.module_vars) - conditional = utils.double_template(self.conditional, inject, self.setup_cache) + conditional = utils.template(self.conditional, inject, self.setup_cache) if not eval(conditional): result = utils.smjson(dict(skipped=True)) self.callbacks.on_skipped(host) diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index a29f7ea254..fefdb87df1 100644 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -265,7 +265,7 @@ def varReplace(raw, vars): return ''.join(done) -def template(text, vars, setup_cache=None, no_engine=True): +def _template(text, vars, setup_cache=None, no_engine=True): ''' run a text buffer through the templating engine ''' vars = vars.copy() vars['hostvars'] = setup_cache @@ -281,8 +281,14 @@ def template(text, vars, setup_cache=None, no_engine=True): res = res + '\n' return res -def double_template(text, vars, setup_cache): - return template(template(text, vars, setup_cache), vars, setup_cache) +def template(text, vars, setup_cache=None, no_engine=True): + ''' 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) + return text def template_from_file(path, vars, setup_cache, no_engine=True): ''' run a file through the templating engine ''' diff --git a/test/TestUtils.py b/test/TestUtils.py index 006a687e8b..b83dcb0312 100644 --- a/test/TestUtils.py +++ b/test/TestUtils.py @@ -236,6 +236,17 @@ class TestUtils(unittest.TestCase): assert res == u'hello wórld' + def test_template_varReplace_iterated(self): + template = 'hello $who' + vars = { + 'who': 'oh great $person', + 'person': 'one', + } + + res = ansible.utils.template(template, vars) + + assert res == u'hello oh great one' + ##################################### ### key-value parsing