From ce85222fa6d7a5a4cc4c331b512df70755567499 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Mon, 12 Mar 2012 22:05:51 -0400 Subject: [PATCH 1/2] What we are running is actually a "play" (multiple plays per playbook) so rename the function to make it more clear --- lib/ansible/playbook.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index 5c96bdb1e46..aa553539f21 100755 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -161,7 +161,7 @@ class PlayBook(object): # loop through all patterns and run them self.callbacks.on_start() for pattern in self.playbook: - self._run_pattern(pattern) + self._run_play(pattern) # summarize the results results = {} @@ -389,7 +389,7 @@ class PlayBook(object): x['run'] = [] x['run'].append(host) - def _run_pattern(self, pg): + def _run_play(self, pg): ''' run a list of tasks for a given pattern, in order ''' From dfd2c6dce3db5c0701f41804fbb664d9a3ddd0aa Mon Sep 17 00:00:00 2001 From: Tim Bielawa Date: Mon, 12 Mar 2012 23:11:54 -0400 Subject: [PATCH 2/2] Implement friendlier error handling. Generic AnsibleError exception + host inventory missing exception. First shot at catching these in a generic way in bin/ansible*. --- bin/ansible | 13 +++++++++---- bin/ansible-playbook | 11 +++++------ lib/ansible/errors.py | 37 +++++++++++++++++++++++++++++++++++++ lib/ansible/runner.py | 6 ++++++ 4 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 lib/ansible/errors.py 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'] = []