summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Bielawa <tbielawa@redhat.com>2012-03-12 23:11:54 -0400
committerTim Bielawa <tbielawa@redhat.com>2012-03-12 23:11:54 -0400
commitdfd2c6dce3db5c0701f41804fbb664d9a3ddd0aa (patch)
tree2e859e9a9110882d39dfc52314b60d7d91e00d3f
parentce85222fa6d7a5a4cc4c331b512df70755567499 (diff)
downloadansible-dfd2c6dce3db5c0701f41804fbb664d9a3ddd0aa.tar.gz
Implement friendlier error handling.
Generic AnsibleError exception + host inventory missing exception. First shot at catching these in a generic way in bin/ansible*.
-rwxr-xr-xbin/ansible13
-rwxr-xr-xbin/ansible-playbook11
-rw-r--r--lib/ansible/errors.py37
-rwxr-xr-xlib/ansible/runner.py6
4 files changed, 57 insertions, 10 deletions
diff --git a/bin/ansible b/bin/ansible
index 9c90b3a79a..1704a45869 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 c91a17bac5..6e2a65b9ef 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 0000000000..e055c09345
--- /dev/null
+++ b/lib/ansible/errors.py
@@ -0,0 +1,37 @@
+# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>
+#
+# 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 <http://www.gnu.org/licenses/>.
+
+
+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 3b44b51bf8..f0cabc3058 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'] = []