summaryrefslogtreecommitdiff
path: root/lib/ansible/playbook/taggable.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/playbook/taggable.py')
-rw-r--r--lib/ansible/playbook/taggable.py33
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