diff --git a/lib/ansible/vars/manager.py b/lib/ansible/vars/manager.py index c9a1faf5c4..47d9fb27b7 100644 --- a/lib/ansible/vars/manager.py +++ b/lib/ansible/vars/manager.py @@ -229,6 +229,24 @@ class VariableManager: all_group = self._inventory.groups.get('all') host_groups = sort_groups([g for g in host.get_groups() if g.name not in ['all']]) + def _get_plugin_vars(plugin, loader, path, entities): + data = {} + try: + data = plugin.get_vars(self._loader, path, entities) + except AttributeError: + try: + for entity in entities: + if isinstance(entity, Host): + data.update(plugin.get_host_vars(entity.name)) + else: + data.update(plugin.get_group_vars(entity.name)) + except AttributeError: + if hasattr(plugin, 'run'): + raise AnsibleError("Cannot use v1 type vars plugin %s from %s" % (plugin._load_name, plugin._original_path)) + else: + raise AnsibleError("Invalid vars plugin %s from %s" % (plugin._load_name, plugin._original_path)) + return data + # internal fuctions that actually do the work def _plugins_inventory(entities): ''' merges all entities by inventory source ''' @@ -240,15 +258,14 @@ class VariableManager: inventory_dir = os.path.dirname(inventory_dir) for plugin in vars_loader.all(): - data = combine_vars(data, plugin.get_vars(self._loader, inventory_dir, entities)) - + data = combine_vars(data, _get_plugin_vars(plugin, self._loader, inventory_dir, entities)) return data def _plugins_play(entities): ''' merges all entities adjacent to play ''' data = {} for plugin in vars_loader.all(): - data = combine_vars(data, plugin.get_vars(self._loader, basedir, entities)) + data = combine_vars(data, _get_plugin_vars(plugin, self._loader, basedir, entities)) return data # configurable functions that are sortable via config