From a89479176739dca239c294a87fb3a9e04a5d49fc Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Sat, 9 Feb 2013 11:37:55 -0500 Subject: [PATCH] Slightly friendlier error on missing hosts file, slightly friendlier error on inventory script returning invalid syntax (or if inventory is non-script and accidentally executable). --- lib/ansible/inventory/__init__.py | 2 +- lib/ansible/inventory/script.py | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/ansible/inventory/__init__.py b/lib/ansible/inventory/__init__.py index 1dbf6cc5ff2..32c757d282c 100644 --- a/lib/ansible/inventory/__init__.py +++ b/lib/ansible/inventory/__init__.py @@ -93,7 +93,7 @@ class Inventory(object): else: raise errors.AnsibleError("YAML inventory support is deprecated in 0.6 and removed in 0.7, see the migration script in examples/scripts in the git checkout") else: - raise errors.AnsibleError("No valid hosts inventory file found") + raise errors.AnsibleError("Unable to find an inventory file, specify one with -i ?") def _match(self, str, pattern_str): if pattern_str.startswith('~'): diff --git a/lib/ansible/inventory/script.py b/lib/ansible/inventory/script.py index b665d4322dc..44d3f37b2be 100644 --- a/lib/ansible/inventory/script.py +++ b/lib/ansible/inventory/script.py @@ -39,27 +39,37 @@ class InventoryScript(object): self.groups = self._parse() def _parse(self): + all_hosts = {} + self.raw = utils.parse_json(self.data) + all = Group('all') + groups = dict(all=all) + group = None + + if 'failed' in self.raw: + raise errors.AnsibleError("failed to parse executable inventory script results") - self.raw = utils.parse_json(self.data) - all=Group('all') - groups = dict(all=all) - group = None for (group_name, data) in self.raw.items(): + group = groups[group_name] = Group(group_name) host = None + if not isinstance(data, dict): data = {'hosts': data} + if 'hosts' in data: + for hostname in data['hosts']: if not hostname in all_hosts: all_hosts[hostname] = Host(hostname) host = all_hosts[hostname] group.add_host(host) + if 'vars' in data: for k, v in data['vars'].iteritems(): group.set_variable(k, v) all.add_child_group(group) + # Separate loop to ensure all groups are defined for (group_name, data) in self.raw.items(): if isinstance(data, dict) and 'children' in data: