From b1da61ae92dd9b999a23c5a10980c6d7eb58153f Mon Sep 17 00:00:00 2001 From: Jeroen Hoekx Date: Fri, 11 May 2012 15:06:34 +0200 Subject: [PATCH] Fix correct variable expansion in includes only_if. There's not need to run the complete include through the templating engine. Several variables were not included before the conditional was evaluated. --- lib/ansible/playbook.py | 3 +-- lib/ansible/runner.py | 9 +++++---- test/TestPlayBook.py | 25 +++++++++++++++++++++++++ test/common_vars.yml | 1 + test/playbook_included.yml | 14 ++++++++++++++ test/playbook_includes.yml | 15 +++++++++++++++ 6 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 test/playbook_included.yml create mode 100644 test/playbook_includes.yml diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index 278fdcf2d14..a8fe033df17 100644 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -160,8 +160,7 @@ class PlayBook(object): include_vars[k] = v inject_vars = play_vars.copy() inject_vars.update(include_vars) - included = utils.template_from_file(path, inject_vars, SETUP_CACHE, no_engine=True) - included = utils.parse_yaml(included) + included = utils.parse_yaml_from_file(path) for x in included: if len(include_vars): x["vars"] = include_vars diff --git a/lib/ansible/runner.py b/lib/ansible/runner.py index 95b04cb1a4d..be92e1da281 100644 --- a/lib/ansible/runner.py +++ b/lib/ansible/runner.py @@ -262,14 +262,15 @@ class Runner(object): async_jid=None, async_module=None, async_limit=None): ''' runs a module that has already been transferred ''' - inject = self.setup_cache.get(conn.host,{}) + inject = self.setup_cache.get(conn.host,{}).copy() + host_variables = self.inventory.get_variables(conn.host) + inject.update(host_variables) + inject.update(self.module_vars) + conditional = utils.double_template(self.conditional, inject, self.setup_cache) if not eval(conditional): return [ utils.smjson(dict(skipped=True)), None, 'skipped' ] - host_variables = self.inventory.get_variables(conn.host) - inject.update(host_variables) - if self.module_name == 'setup': args = self._add_setup_vars(inject, args) args = self._add_setup_metadata(args) diff --git a/test/TestPlayBook.py b/test/TestPlayBook.py index c8c2eea4105..72670ee4c30 100644 --- a/test/TestPlayBook.py +++ b/test/TestPlayBook.py @@ -172,3 +172,28 @@ class TestPlaybook(unittest.TestCase): print data assert data.find("ears") != -1, "template success" + def test_includes(self): + pb = os.path.join(self.test_dir, 'playbook_includes.yml') + actual = self._run(pb) + + for i, event in enumerate(EVENTS): + print "EVENT %s"%(i) + print event + + if i == 6: + assert 'blue' in event[1][1]['cmd'] + + if i == 8: + assert 'quack' in event[1][1]['cmd'] + + if i == 10: + assert 'RAN' in event[1][1]['cmd'] + + if i == 12: + assert 'RAN' in event[1][1]['cmd'] + + if i == 14: + assert 'red' in event[1][1]['cmd'] + + if i == 18 or i == 20: + assert 'skipped' in event[0] diff --git a/test/common_vars.yml b/test/common_vars.yml index d9f2a9b2dbb..c4c09b67f29 100644 --- a/test/common_vars.yml +++ b/test/common_vars.yml @@ -1,3 +1,4 @@ --- duck: quack cow: moo +extguard: " '$favcolor' == 'blue' " diff --git a/test/playbook_included.yml b/test/playbook_included.yml new file mode 100644 index 00000000000..6fb41de47eb --- /dev/null +++ b/test/playbook_included.yml @@ -0,0 +1,14 @@ +--- +- name: test vars + action: shell echo $favcolor + +- name: test vars_files + action: shell echo $duck + +- name: test vars condition + action: shell echo RAN + only_if: $guard + +- name: test vars_files condition + action: shell echo RAN + only_if: $extguard diff --git a/test/playbook_includes.yml b/test/playbook_includes.yml new file mode 100644 index 00000000000..b1dd36c69ab --- /dev/null +++ b/test/playbook_includes.yml @@ -0,0 +1,15 @@ +--- +# Test correct variable expansion in included files and only if +- hosts: all + vars: + favcolor: "blue" + guard: ' "$favcolor" == "blue" ' + vars_files: + - common_vars.yml + + tasks: + + - include: playbook_included.yml + + # test overrides of variables + - include: playbook_included.yml favcolor=red