from ansible.plugins.callback import CallbackBase from ansible.utils.color import colorize_message, hostcolor from datetime import datetime class CallbackModule(CallbackBase): CALLBACK_VERSION = 2.0 CALLBACK_NAME = 'task_logger' CALLBACK_TYPE = 'stdout' CALLBACK_NEEDS_WHITELIST = False def __init__(self): super(CallbackModule, self).__init__() self.task_count = 0 self.start_time = datetime.now() def v2_playbook_on_start(self, playbook): self._display.display("\n" + "="*80, color='blue') self._display.display("PLAYBOOK STARTED", color='blue') self._display.display("="*80 + "\n", color='blue') def v2_playbook_on_play_start(self, play): self._display.display("\n" + "-"*80, color='cyan') self._display.display(f"PLAY: {play.name}", color='cyan') self._display.display("-"*80 + "\n", color='cyan') def v2_runner_on_start(self, host, task): self.task_count += 1 task_name = task.name or "unnamed task" self._display.display( f"[{self.task_count}] TASK: {task_name}", color='blue' ) def v2_runner_on_ok(self, result, **kwargs): self._display.display(f" ✓ OK\n", color='green') def v2_runner_on_failed(self, result, ignore_errors=False, **kwargs): task_name = result.task_name or "unnamed task" self._display.display( f" ✗ FAILED: {task_name}\n", color='red' ) def v2_runner_on_skipped(self, result, **kwargs): self._display.display(f" ⊘ SKIPPED\n", color='yellow') def v2_runner_on_unreachable(self, result): self._display.display( f" ✗ UNREACHABLE\n", color='red' ) def v2_playbook_on_stats(self, stats): self._display.display("\n" + "="*80, color='blue') self._display.display("PLAYBOOK FINISHED", color='blue') self._display.display("="*80, color='blue') # Statistiken anzeigen hosts = sorted(stats.processed.keys()) for host in hosts: summary = stats.summarize(host) self._display.display( f"\n{host}: ok={summary['ok']} changed={summary['changed']} " f"failed={summary['failures']} skipped={summary['skipped']} " f"unreachable={summary['unreachable']}", color='cyan' ) self._display.display("\n")