diff --git a/lib/ansible/executor/playbook_executor.py b/lib/ansible/executor/playbook_executor.py index e6bde76c4d9..d647c8246a3 100644 --- a/lib/ansible/executor/playbook_executor.py +++ b/lib/ansible/executor/playbook_executor.py @@ -31,7 +31,6 @@ from ansible.executor.task_queue_manager import TaskQueueManager from ansible.playbook import Playbook from ansible.template import Templar -from ansible.utils.color import colorize, hostcolor from ansible.utils.encrypt import do_encrypt from ansible.utils.unicode import to_unicode @@ -174,6 +173,10 @@ class PlaybookExecutor: if entry: entrylist.append(entry) # per playbook + # send the stats callback for this playbook + if self._tqm is not None: + self._tqm.send_callback('v2_playbook_on_stats', self._tqm._stats) + # if the last result wasn't zero, break out of the playbook file name loop if result != 0: break @@ -183,42 +186,12 @@ class PlaybookExecutor: finally: if self._tqm is not None: - self._tqm.send_callback('v2_playbook_on_stats', self._tqm._stats) self._cleanup() if self._options.syntax: display.display("No issues encountered") return result - # TODO: this stat summary stuff should be cleaned up and moved - # to a new method, if it even belongs here... - display.banner("PLAY RECAP") - - hosts = sorted(self._tqm._stats.processed.keys()) - for h in hosts: - t = self._tqm._stats.summarize(h) - - display.display(u"%s : %s %s %s %s" % ( - hostcolor(h, t), - colorize(u'ok', t['ok'], 'green'), - colorize(u'changed', t['changed'], 'yellow'), - colorize(u'unreachable', t['unreachable'], 'red'), - colorize(u'failed', t['failures'], 'red')), - screen_only=True - ) - - display.display(u"%s : %s %s %s %s" % ( - hostcolor(h, t, False), - colorize(u'ok', t['ok'], None), - colorize(u'changed', t['changed'], None), - colorize(u'unreachable', t['unreachable'], None), - colorize(u'failed', t['failures'], None)), - log_only=True - ) - - display.display("", screen_only=True) - # END STATS STUFF - return result def _cleanup(self, signum=None, framenum=None): diff --git a/lib/ansible/plugins/callback/default.py b/lib/ansible/plugins/callback/default.py index 611244760d1..3175bf3e53c 100644 --- a/lib/ansible/plugins/callback/default.py +++ b/lib/ansible/plugins/callback/default.py @@ -21,6 +21,7 @@ __metaclass__ = type from ansible import constants as C from ansible.plugins.callback import CallbackBase +from ansible.utils.color import colorize, hostcolor class CallbackModule(CallbackBase): @@ -193,3 +194,30 @@ class CallbackModule(CallbackBase): color = 'cyan' self._display.display(msg, color='cyan') + def v2_playbook_on_stats(self, stats): + self._display.banner("PLAY RECAP") + + hosts = sorted(stats.processed.keys()) + for h in hosts: + t = stats.summarize(h) + + self._display.display(u"%s : %s %s %s %s" % ( + hostcolor(h, t), + colorize(u'ok', t['ok'], 'green'), + colorize(u'changed', t['changed'], 'yellow'), + colorize(u'unreachable', t['unreachable'], 'red'), + colorize(u'failed', t['failures'], 'red')), + screen_only=True + ) + + self._display.display(u"%s : %s %s %s %s" % ( + hostcolor(h, t, False), + colorize(u'ok', t['ok'], None), + colorize(u'changed', t['changed'], None), + colorize(u'unreachable', t['unreachable'], None), + colorize(u'failed', t['failures'], None)), + log_only=True + ) + + self._display.display("", screen_only=True) +