diff --git a/bin/ansible-playbook b/bin/ansible-playbook index 05d555b4dd..08d56117f6 100755 --- a/bin/ansible-playbook +++ b/bin/ansible-playbook @@ -21,11 +21,39 @@ import sys import ansible.playbook import ansible.constants as C +from ansible.utils import * import getpass from optparse import OptionParser ####################################################### +class PlaybookCallbacks(object): + + def __init__(self): + pass + + def set_playbook(self, playbook): + self.playbook = playbook + + def on_start(self): + print "\n" + + def on_task_start(self, name, is_conditional): + print task_start_msg(name, is_conditional) + + def on_unreachable(self, host, msg): + print "unreachable: [%s] => %s" % (host, msg) + + def on_failed(self, host, results): + print "failed: [%s] => %s\n" % (host, smjson(results)) + + def on_ok(self, host): + print "ok: [%s]\n" % (host) + + def on_play_start(self, pattern): + print "PLAY [%s] ****************************\n" % pattern + + def main(args): ''' run ansible-playbook operations ''' @@ -60,6 +88,7 @@ def main(args): forks=options.forks, verbose=True, remote_pass=sshpass, + callbacks=PlaybookCallbacks() ) pb.run() diff --git a/hacking/env-setup b/hacking/env-setup index ca049f0775..812f269e1c 100755 --- a/hacking/env-setup +++ b/hacking/env-setup @@ -1,5 +1,5 @@ # -*- mode: shell-script -*- -PREFIX_PYTHONPATH="`pwd`/lib/ansible:`pwd`/lib" +PREFIX_PYTHONPATH="`pwd`/lib" PREFIX_PATH="`pwd`/bin" PREFIX_MANPATH="`pwd`/docs/man" PREFIX_ANS_LIBRARY="`pwd`/library" @@ -9,6 +9,7 @@ export PYTHONPATH=$PREFIX_PYTHONPATH:$PYTHONPATH echo "Prefixing PATH with $PREFIX_PATH" export PATH=$PREFIX_PATH:$PATH +echo $PATH echo "Prefixing MANPATH with $PREFIX_MANPATH" export MANPATH=$PREFIX_MANPATH:$MANPATH diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index 390b75b291..a1ca5a641b 100755 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -50,7 +50,8 @@ class PlayBook(object): timeout =C.DEFAULT_TIMEOUT, remote_user =C.DEFAULT_REMOTE_USER, remote_pass =C.DEFAULT_REMOTE_PASS, - verbose=False): + verbose=False, + callbacks=None): # TODO, once ansible-playbook is it's own script this will # have much LESS parameters to the constructor and will @@ -64,6 +65,8 @@ class PlayBook(object): self.remote_user = remote_user self.remote_pass = remote_pass self.verbose = verbose + self.callbacks = callbacks + self.callbacks.set_playbook(self) # store the list of changes/invocations/failure counts # as a dictionary of integers keyed off the hostname @@ -131,10 +134,9 @@ class PlayBook(object): ''' run all patterns in the playbook ''' # loop through all patterns and run them + self.callbacks.on_start() for pattern in self.playbook: self._run_pattern(pattern) - if self.verbose: - print "\n" # summarize the results results = {} @@ -200,8 +202,7 @@ class PlayBook(object): # as the result of a change handler on a subset # of all of the hosts - if self.verbose: - print task_start_msg(name, conditional) + self.callbacks.on_task_start(name, conditional) # load up an appropriate ansible runner to # run the task in parallel @@ -222,8 +223,7 @@ class PlayBook(object): for host, msg in dark.items(): self.processed[host] = 1 - if self.verbose: - print "unreachable: [%s] => %s" % (host, msg) + self.callbacks.on_unreachable(host, msg) if not host in self.dark: self.dark[host] = 1 else: @@ -233,15 +233,13 @@ class PlayBook(object): self.processed[host] = 1 if is_failed(results): - if self.verbose: - print "failed: [%s] => %s\n" % (host, smjson(results)) + self.callbacks.on_failed(host, results) if not host in self.failures: self.failures[host] = 1 else: self.failures[host] = self.failures[host] + 1 else: - if self.verbose: - print "ok: [%s]\n" % host + self.callbacks.on_ok(host) if not host in self.invocations: self.invocations[host] = 1 else: @@ -297,8 +295,7 @@ class PlayBook(object): self.host_list, groups = ansible.runner.Runner.parse_hosts(self.host_list) - if self.verbose: - print "PLAY [%s] ****************************\n" % pattern + self.callbacks.on_play_start(pattern) # first run the setup task on every node, which gets the variables # written to the JSON file and will also bubble facts back up via