diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index cd7a461867..40274c5108 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -70,36 +70,31 @@ 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) - if items is None: - items = [ '' ] - for item in items: - mv = self.vars.copy() - mv['item'] = item - results.append(Task(self,x,module_vars=mv)) + data = [x] else: raise Exception("unexpected task type") + for y in data: + 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 + results.append(Task(self,y,module_vars=mv)) return results # ************************************************* diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index d9805b1304..1f7c9e85bb 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'])