diff --git a/lib/ansible/playbook/base.py b/lib/ansible/playbook/base.py index bee42e2f3d..6e0e3b5738 100644 --- a/lib/ansible/playbook/base.py +++ b/lib/ansible/playbook/base.py @@ -105,7 +105,10 @@ class Base: if hasattr(self, method): return getattr(self, method)() - return self._attributes[prop_name] + value = self._attributes[prop_name] + if value is None and hasattr(self, '_get_parent_attribute'): + value = self._get_parent_attribute(prop_name) + return value @staticmethod def _generic_s(prop_name, self, value): diff --git a/lib/ansible/playbook/block.py b/lib/ansible/playbook/block.py index 395f36bf02..3831ed7600 100644 --- a/lib/ansible/playbook/block.py +++ b/lib/ansible/playbook/block.py @@ -271,45 +271,50 @@ class Block(Base, Become, Conditional, Taggable): Generic logic to get the attribute or parent attribute for a block value. ''' - value = self._attributes[attr] - if self._parent_block and (value is None or extend): - parent_value = getattr(self._parent_block, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value - if self._task_include and (value is None or extend): - parent_value = getattr(self._task_include, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value - if self._role and (value is None or extend): - parent_value = getattr(self._role, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value + value = None + try: + value = self._attributes[attr] - if len(self._dep_chain) and (not value or extend): - reverse_dep_chain = self._dep_chain[:] - reverse_dep_chain.reverse() - for dep in reverse_dep_chain: - dep_value = getattr(dep, attr) - if extend: - value = self._extend_value(value, dep_value) - else: - value = dep_value + if self._parent_block and (value is None or extend): + parent_value = getattr(self._parent_block, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + if self._task_include and (value is None or extend): + parent_value = getattr(self._task_include, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + if self._role and (value is None or extend): + parent_value = getattr(self._role, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value - if value is not None and not extend: - break + if len(self._dep_chain) and (not value or extend): + reverse_dep_chain = self._dep_chain[:] + reverse_dep_chain.reverse() + for dep in reverse_dep_chain: + dep_value = getattr(dep, attr) + if extend: + value = self._extend_value(value, dep_value) + else: + value = dep_value - if self._play and (value is None or extend): - parent_value = getattr(self._play, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value + if value is not None and not extend: + break + + if self._play and (value is None or extend): + parent_value = getattr(self._play, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + except KeyError: + pass return value diff --git a/lib/ansible/playbook/task.py b/lib/ansible/playbook/task.py index 8f7e1b7715..e706aa1820 100644 --- a/lib/ansible/playbook/task.py +++ b/lib/ansible/playbook/task.py @@ -363,19 +363,25 @@ class Task(Base, Conditional, Taggable, Become): ''' Generic logic to get the attribute or parent attribute for a task value. ''' - value = self._attributes[attr] - if self._block and (value is None or extend): - parent_value = getattr(self._block, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value - if self._task_include and (value is None or extend): - parent_value = getattr(self._task_include, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value + value = None + try: + value = self._attributes[attr] + + if self._block and (value is None or extend): + parent_value = getattr(self._block, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + if self._task_include and (value is None or extend): + parent_value = getattr(self._task_include, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + except KeyError: + pass + return value def _get_attr_environment(self):