diff --git a/lib/ansible/executor/playbook_executor.py b/lib/ansible/executor/playbook_executor.py index b35333789b5..81c36d88ae8 100644 --- a/lib/ansible/executor/playbook_executor.py +++ b/lib/ansible/executor/playbook_executor.py @@ -83,6 +83,9 @@ class PlaybookExecutor: self._display.vv('%d plays in %s' % (len(plays), playbook_path)) for play in plays: + if play._included_path is not None: + self._loader.set_basedir(play._included_path) + # clear any filters which may have been applied to the inventory self._inventory.remove_restriction() diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index 55f994f305e..9d1959c1e58 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -95,6 +95,7 @@ class Play(Base, Taggable, Become): def __init__(self): super(Play, self).__init__() + self._included_path = None self.ROLE_CACHE = {} def __repr__(self): @@ -321,12 +322,14 @@ class Play(Base, Taggable, Become): for role in self.get_roles(): roles.append(role.serialize()) data['roles'] = roles + data['included_path'] = self._included_path return data def deserialize(self, data): super(Play, self).deserialize(data) + self._included_path = data.get('included_path', None) if 'roles' in data: role_data = data.get('roles', []) roles = [] @@ -341,5 +344,6 @@ class Play(Base, Taggable, Become): def copy(self): new_me = super(Play, self).copy() new_me.ROLE_CACHE = self.ROLE_CACHE.copy() + new_me._included_path = self._included_path return new_me diff --git a/lib/ansible/playbook/playbook_include.py b/lib/ansible/playbook/playbook_include.py index 247cd3f5171..05a3dcb3a1d 100644 --- a/lib/ansible/playbook/playbook_include.py +++ b/lib/ansible/playbook/playbook_include.py @@ -80,6 +80,8 @@ class PlaybookInclude(Base, Conditional, Taggable): temp_vars.update(new_obj.vars) entry.vars = temp_vars entry.tags = list(set(entry.tags).union(new_obj.tags)) + if entry._included_path is None: + entry._included_path = os.path.dirname(file_name) return pb