diff options
Diffstat (limited to 'lib/ansible/playbook/taggable.py')
-rw-r--r-- | lib/ansible/playbook/taggable.py | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/lib/ansible/playbook/taggable.py b/lib/ansible/playbook/taggable.py index 4038d7f5..828c7b2e 100644 --- a/lib/ansible/playbook/taggable.py +++ b/lib/ansible/playbook/taggable.py @@ -23,6 +23,17 @@ from ansible.errors import AnsibleError from ansible.module_utils.six import string_types from ansible.playbook.attribute import FieldAttribute from ansible.template import Templar +from ansible.utils.sentinel import Sentinel + + +def _flatten_tags(tags: list) -> list: + rv = set() + for tag in tags: + if isinstance(tag, list): + rv.update(tag) + else: + rv.add(tag) + return list(rv) class Taggable: @@ -34,11 +45,7 @@ class Taggable: if isinstance(ds, list): return ds elif isinstance(ds, string_types): - value = ds.split(',') - if isinstance(value, list): - return [x.strip() for x in value] - else: - return [ds] + return [x.strip() for x in ds.split(',')] else: raise AnsibleError('tags must be specified as a list', obj=ds) @@ -47,16 +54,12 @@ class Taggable: if self.tags: templar = Templar(loader=self._loader, variables=all_vars) - tags = templar.template(self.tags) - - _temp_tags = set() - for tag in tags: - if isinstance(tag, list): - _temp_tags.update(tag) - else: - _temp_tags.add(tag) - tags = _temp_tags - self.tags = list(tags) + obj = self + while obj is not None: + if (_tags := getattr(obj, "_tags", Sentinel)) is not Sentinel: + obj._tags = _flatten_tags(templar.template(_tags)) + obj = obj._parent + tags = set(self.tags) else: # this makes isdisjoint work for untagged tags = self.untagged |