summaryrefslogtreecommitdiff
path: root/lib/ansible/playbook/block.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/playbook/block.py')
-rw-r--r--lib/ansible/playbook/block.py81
1 files changed, 42 insertions, 39 deletions
diff --git a/lib/ansible/playbook/block.py b/lib/ansible/playbook/block.py
index cde41172f6..29f8742165 100644
--- a/lib/ansible/playbook/block.py
+++ b/lib/ansible/playbook/block.py
@@ -278,6 +278,9 @@ class Block(Base, Become, Conditional, Taggable):
for dep in dep_chain:
dep.set_loader(loader)
+ def _get_attr_environment(self):
+ return self._get_parent_attribute('environment', extend=True)
+
def _get_parent_attribute(self, attr, extend=False):
'''
Generic logic to get the attribute or parent attribute for a block value.
@@ -288,50 +291,50 @@ class Block(Base, Become, Conditional, Taggable):
value = self._attributes[attr]
if self._parent and (value is None or extend):
- parent_value = getattr(self._parent, attr, None)
- if extend:
- value = self._extend_value(value, parent_value)
- else:
- value = parent_value
- if self._role and (value is None or extend) and hasattr(self._role, attr):
- parent_value = getattr(self._role, attr, None)
- if extend:
- value = self._extend_value(value, parent_value)
- else:
- value = parent_value
-
- dep_chain = self.get_dep_chain()
- if dep_chain and (value is None or extend):
- dep_chain.reverse()
- for dep in dep_chain:
- dep_value = getattr(dep, attr, None)
- if extend:
- value = self._extend_value(value, dep_value)
- else:
- value = dep_value
-
- if value is not None and not extend:
- break
- if self._play and (value is None or extend) and hasattr(self._play, attr):
- parent_value = getattr(self._play, attr, None)
- if extend:
- value = self._extend_value(value, parent_value)
- else:
- value = parent_value
+ try:
+ parent_value = getattr(self._parent, attr, None)
+ if extend:
+ value = self._extend_value(value, parent_value)
+ else:
+ value = parent_value
+ except AttributeError:
+ pass
+ if self._role and (value is None or extend):
+ try:
+ parent_value = getattr(self._role, attr, None)
+ if extend:
+ value = self._extend_value(value, parent_value)
+ else:
+ value = parent_value
+
+ dep_chain = self.get_dep_chain()
+ if dep_chain and (value is None or extend):
+ dep_chain.reverse()
+ for dep in dep_chain:
+ dep_value = getattr(dep, attr, None)
+ if extend:
+ value = self._extend_value(value, dep_value)
+ else:
+ value = dep_value
+
+ if value is not None and not extend:
+ break
+ except AttributeError:
+ pass
+ if self._play and (value is None or extend):
+ try:
+ parent_value = getattr(self._play, attr, None)
+ if extend:
+ value = self._extend_value(value, parent_value)
+ else:
+ value = parent_value
+ except AttributeError:
+ pass
except KeyError as e:
pass
return value
- def _get_attr_environment(self):
- return self._get_parent_attribute('environment')
-
- def _get_attr_any_errors_fatal(self):
- '''
- Override for the 'tags' getattr fetcher, used from Base.
- '''
- return self._get_parent_attribute('any_errors_fatal')
-
def filter_tagged_tasks(self, play_context, all_vars):
'''
Creates a new block, with task lists filtered based on the tags contained