From 933b5e8631877f41b05e0d4dee5d56b20be2d1a4 Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Sat, 9 Jun 2012 21:42:45 +0200 Subject: [PATCH 1/2] Reduce code duplication --- lib/ansible/playbook/play.py | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index cd7a461867..3f579747f4 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -70,36 +70,29 @@ class Play(object): def _load_tasks(self, ds, keyname): ''' handle task and handler include statements ''' - items = ds.get(keyname, []) + tasks = ds.get(keyname, []) results = [] - for x in items: + for x in tasks: + task_vars = self.vars.copy() if 'include' in x: - task_vars = self.vars.copy() tokens = shlex.split(x['include']) for t in tokens[1:]: (k,v) = t.split("=", 1) task_vars[k]=v include_file = tokens[0] data = utils.parse_yaml_from_file(utils.path_dwim(self.playbook.basedir, include_file)) - for y in data: - items = y.get('with_items',None) - if items is None: - items = [ '' ] - for item in items: - mv = self.vars.copy() - mv.update(task_vars) - mv['item'] = item - results.append(Task(self,y,module_vars=mv)) elif type(x) == dict: - items = x.get('with_items', None) + data = [x] + else: + raise Exception("unexpected task type") + for y in data: + items = y.get('with_items',None) if items is None: items = [ '' ] for item in items: - mv = self.vars.copy() + mv = task_vars.copy() mv['item'] = item - results.append(Task(self,x,module_vars=mv)) - else: - raise Exception("unexpected task type") + results.append(Task(self,y,module_vars=mv)) return results # ************************************************* From a05da2d312850f52cb91c9c2ee0f79352ae69c24 Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Sat, 9 Jun 2012 21:59:22 +0200 Subject: [PATCH 2/2] Allow with_items to specify a variable --- lib/ansible/playbook/play.py | 2 ++ lib/ansible/utils.py | 10 ++++++++-- test/TestUtils.py | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index 3f579747f4..40274c5108 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -89,6 +89,8 @@ class Play(object): items = y.get('with_items',None) if items is None: items = [ '' ] + elif isinstance(items, basestring): + items = utils.varLookup(items, task_vars) for item in items: mv = task_vars.copy() mv['item'] = item diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index c507103d67..c06d3024d8 100644 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -201,7 +201,7 @@ def parse_json(data): _LISTRE = re.compile(r"(\w+)\[(\d+)\]") -def varLookup(name, vars): +def _varLookup(name, vars): ''' find the contents of a possibly complex variable in vars. ''' path = name.split('.') space = vars @@ -223,6 +223,12 @@ def varLookup(name, vars): _KEYCRE = re.compile(r"\$(?P\{){0,1}((?(complex)[\w\.\[\]]+|\w+))(?(complex)\})") # if { -> complex if complex, allow . and need trailing } +def varLookup(varname, vars): + m = _KEYCRE.search(varname) + if not m: + return None + return _varLookup(m.group(2), vars) + def varReplace(raw, vars): '''Perform variable replacement of $vars @@ -245,7 +251,7 @@ def varReplace(raw, vars): # original) varname = m.group(2) - replacement = unicode(varLookup(varname, vars) or m.group()) + replacement = unicode(_varLookup(varname, vars) or m.group()) start, end = m.span() done.append(raw[:start]) # Keep stuff leading up to token diff --git a/test/TestUtils.py b/test/TestUtils.py index 7d03e17c47..006a687e8b 100644 --- a/test/TestUtils.py +++ b/test/TestUtils.py @@ -17,7 +17,7 @@ class TestUtils(unittest.TestCase): } } - res = ansible.utils.varLookup('data.who', vars) + res = ansible.utils._varLookup('data.who', vars) assert sorted(res) == sorted(vars['data']['who'])