From 41f2b5dec5f7e5c5abe784fb3734e277ec27f8e9 Mon Sep 17 00:00:00 2001 From: Alexei Znamensky <103110+russoz@users.noreply.github.com> Date: Thu, 30 Apr 2026 07:25:43 +1200 Subject: [PATCH] selective callback plugin: route output through `display` to honour `ANSIBLE_LOG_PATH` (#11927) * fix(selective): route output through display to honour ANSIBLE_LOG_PATH Co-Authored-By: Claude Sonnet 4.6 * fix(selective): add changelog fragment for PR 11927 --------- Co-authored-by: Claude Sonnet 4.6 --- .../fragments/11927-selective-log-path.yml | 5 ++++ plugins/callback/selective.py | 28 +++++++++---------- 2 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 changelogs/fragments/11927-selective-log-path.yml diff --git a/changelogs/fragments/11927-selective-log-path.yml b/changelogs/fragments/11927-selective-log-path.yml new file mode 100644 index 0000000000..0bcd417657 --- /dev/null +++ b/changelogs/fragments/11927-selective-log-path.yml @@ -0,0 +1,5 @@ +bugfixes: + - selective callback plugin - route all output through ``self._display.display()`` + instead of bare ``print()`` calls, fixing missing output when ``ANSIBLE_LOG_PATH`` + is set (https://github.com/ansible-collections/community.general/issues/4850, + https://github.com/ansible-collections/community.general/pull/11927). diff --git a/plugins/callback/selective.py b/plugins/callback/selective.py index ba9a9f939a..969e553bfe 100644 --- a/plugins/callback/selective.py +++ b/plugins/callback/selective.py @@ -101,10 +101,10 @@ class CallbackModule(CallbackBase): self.printed_last_task = True line_length = 120 if self.last_skipped: - print() + self._display.display("") line = f"# {task_name} " msg = colorize(f"{line}{'*' * (line_length - len(line))}", "bold") - print(msg) + self._display.display(msg) def _indent_text(self, text, indent_level): lines = text.splitlines() @@ -128,7 +128,7 @@ class CallbackModule(CallbackBase): diff = dict_diff(diff["before"], diff["after"]) if diff: diff = colorize(str(diff), "changed") - print(self._indent_text(diff, indent_level + 4)) + self._display.display(self._indent_text(diff, indent_level + 4)) def _print_host_or_item(self, host_or_item, changed, msg, diff, is_host, error, stdout, stderr): if is_host: @@ -156,19 +156,19 @@ class CallbackModule(CallbackBase): if len(msg) < 50: line += f" -- {msg}" - print(f"{line} {'-' * (line_length - len(line))}---------") + self._display.display(f"{line} {'-' * (line_length - len(line))}---------") else: - print(f"{line} {'-' * (line_length - len(line))}") - print(self._indent_text(msg, indent_level + 4)) + self._display.display(f"{line} {'-' * (line_length - len(line))}") + self._display.display(self._indent_text(msg, indent_level + 4)) if diff: self._print_diff(diff, indent_level) if stdout: stdout = colorize(stdout, "failed") - print(self._indent_text(stdout, indent_level + 4)) + self._display.display(self._indent_text(stdout, indent_level + 4)) if stderr: stderr = colorize(stderr, "failed") - print(self._indent_text(stderr, indent_level + 4)) + self._display.display(self._indent_text(stderr, indent_level + 4)) def v2_playbook_on_play_start(self, play): """Run on start of the play.""" @@ -223,7 +223,7 @@ class CallbackModule(CallbackBase): def v2_playbook_on_stats(self, stats): """Display info about playbook statistics.""" - print() + self._display.display("") self.printed_last_task = False self._print_task("STATS") @@ -242,7 +242,7 @@ class CallbackModule(CallbackBase): f"{host} : ok={s['ok']}\tchanged={s['changed']}\tfailed={s['failures']}\tunreachable=" f"{s['unreachable']}\trescued={s['rescued']}\tignored={s['ignored']}" ) - print(colorize(msg, color)) + self._display.display(colorize(msg, color)) def v2_runner_on_skipped(self, result, **kwargs): """Run when a task is skipped.""" @@ -258,11 +258,11 @@ class CallbackModule(CallbackBase): reason = result._result.get("skipped_reason", "") or result._result.get("skip_reason", "") if len(reason) < 50: line += f" -- {reason}" - print(f"{line} {'-' * (line_length - len(line))}---------") + self._display.display(f"{line} {'-' * (line_length - len(line))}---------") else: - print(f"{line} {'-' * (line_length - len(line))}") - print(self._indent_text(reason, 8)) - print(reason) + self._display.display(f"{line} {'-' * (line_length - len(line))}") + self._display.display(self._indent_text(reason, 8)) + self._display.display(reason) def v2_runner_on_ok(self, result, **kwargs): self._print_task_result(result, error=False, **kwargs)