diff --git a/lib/ansible/inventory/__init__.py b/lib/ansible/inventory/__init__.py index b6f644190f..a8cca8faaf 100644 --- a/lib/ansible/inventory/__init__.py +++ b/lib/ansible/inventory/__init__.py @@ -99,12 +99,40 @@ class Inventory(object): self.host_list = os.path.join(self.host_list, "") self.parser = InventoryDirectory(filename=host_list) self.groups = self.parser.groups.values() - elif utils.is_executable(host_list): - self.parser = InventoryScript(filename=host_list) - self.groups = self.parser.groups.values() else: - self.parser = InventoryParser(filename=host_list) - self.groups = self.parser.groups.values() + # check to see if the specified file starts with a + # shebang (#!/), so if an error is raised by the parser + # class we can show a more apropos error + shebang_present = False + try: + inv_file = open(host_list) + first_line = inv_file.readlines()[0] + inv_file.close() + if first_line.find('#!') == 0: + shebang_present = True + except: + pass + + if utils.is_executable(host_list): + try: + self.parser = InventoryScript(filename=host_list) + self.groups = self.parser.groups.values() + except: + if not shebang_present: + raise errors.AnsibleError("The file %s is marked as executable, but failed to execute correctly. " % host_list + \ + "If this is not supposed to be an executable script, correct this with `chmod -x %s`." % host_list) + else: + raise + else: + try: + self.parser = InventoryParser(filename=host_list) + self.groups = self.parser.groups.values() + except: + if shebang_present: + raise errors.AnsibleError("The file %s looks like it should be an executable inventory script, but is not marked executable. " % host_list + \ + "Perhaps you want to correct this with `chmod +x %s`?" % host_list) + else: + raise utils.plugins.vars_loader.add_directory(self.basedir(), with_subdir=True) else: