diff --git a/bin/ansible b/bin/ansible index 9c90b3a79ab..1704a458693 100755 --- a/bin/ansible +++ b/bin/ansible @@ -34,6 +34,7 @@ import ansible.runner import ansible.playbook import ansible.constants as C from ansible.utils import * +from ansible.errors import * ######################################################## @@ -193,7 +194,11 @@ class Cli(object): if __name__ == '__main__': cli = Cli() (options, args) = cli.parse() - (runner, results) = cli.run(options, args) - cli.output(runner, results, options, args) - - + try: + (runner, results) = cli.run(options, args) + except AnsibleError as e: + # Generic handler for ansible specific errors + print e + sys.exit(1) + else: + cli.output(runner, results, options, args) diff --git a/bin/ansible-playbook b/bin/ansible-playbook index c91a17bac58..6e2a65b9ef3 100755 --- a/bin/ansible-playbook +++ b/bin/ansible-playbook @@ -96,15 +96,14 @@ def main(args): remote_pass=sshpass, callbacks=PlaybookCallbacks() ) - pb.run() + try: + pb.run() + except AnsibleError as e: + print e + return 1 return 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:])) - - - - - diff --git a/lib/ansible/errors.py b/lib/ansible/errors.py new file mode 100644 index 00000000000..e055c093454 --- /dev/null +++ b/lib/ansible/errors.py @@ -0,0 +1,37 @@ +# (c) 2012, Michael DeHaan +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + + +class AnsibleError(Exception): + """ + The base Ansible exception from which all others should subclass. + """ + pass + + +class AnsibleInventoryNotFoundError(AnsibleError): + """ + Exception raised when the default or provided host inventory file + does not exist. + """ + def __init__(self, inventory): + self.inventory = inventory + self.msg = "Unable to continue, inventory file not found: %s" %\ + self.inventory + + def __str__(self): + return self.msg diff --git a/lib/ansible/runner.py b/lib/ansible/runner.py index 3b44b51bf8d..f0cabc30584 100755 --- a/lib/ansible/runner.py +++ b/lib/ansible/runner.py @@ -39,6 +39,8 @@ import random import jinja2 import time from ansible.utils import * +from ansible.errors import AnsibleInventoryNotFoundError + ################################################ @@ -127,6 +129,10 @@ class Runner(object): return (host_list, {}) host_list = os.path.expanduser(host_list) + + if not os.path.exists(host_list): + raise AnsibleInventoryNotFoundError(host_list) + lines = file(host_list).read().split("\n") groups = {} groups['ungrouped'] = []