mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-25 03:41:25 -07:00
Implement the `v2_playbook_on_handler_task_start()' method in the json callback plugin to correctly include handlers in the results. This fixes a bug where the last task in the results returned by json callback would be wrong if an unconditional handler was triggered, since the result of that handler would overwrite the result of the last task. Signed-off-by: Alex Tsitsimpis <alextsi@arrikto.com>
84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
# (c) 2016, Matt Martz <matt@sivel.net>
|
|
# (c) 2017 Ansible Project
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
# Make coding more python3-ish
|
|
from __future__ import (absolute_import, division, print_function)
|
|
__metaclass__ = type
|
|
|
|
DOCUMENTATION = '''
|
|
callback: json
|
|
short_description: Ansible screen output as JSON
|
|
version_added: "2.2"
|
|
description:
|
|
- This callback converts all events into JSON output to stdout
|
|
type: stdout
|
|
requirements:
|
|
- Set as stdout in config
|
|
'''
|
|
|
|
import json
|
|
|
|
from ansible.plugins.callback import CallbackBase
|
|
|
|
|
|
class CallbackModule(CallbackBase):
|
|
CALLBACK_VERSION = 2.0
|
|
CALLBACK_TYPE = 'stdout'
|
|
CALLBACK_NAME = 'json'
|
|
|
|
def __init__(self, display=None):
|
|
super(CallbackModule, self).__init__(display)
|
|
self.results = []
|
|
|
|
def _new_play(self, play):
|
|
return {
|
|
'play': {
|
|
'name': play.name,
|
|
'id': str(play._uuid)
|
|
},
|
|
'tasks': []
|
|
}
|
|
|
|
def _new_task(self, task):
|
|
return {
|
|
'task': {
|
|
'name': task.name,
|
|
'id': str(task._uuid)
|
|
},
|
|
'hosts': {}
|
|
}
|
|
|
|
def v2_playbook_on_play_start(self, play):
|
|
self.results.append(self._new_play(play))
|
|
|
|
def v2_playbook_on_task_start(self, task, is_conditional):
|
|
self.results[-1]['tasks'].append(self._new_task(task))
|
|
|
|
def v2_playbook_on_handler_task_start(self, task):
|
|
self.results[-1]['tasks'].append(self._new_task(task))
|
|
|
|
def v2_runner_on_ok(self, result, **kwargs):
|
|
host = result._host
|
|
self.results[-1]['tasks'][-1]['hosts'][host.name] = result._result
|
|
|
|
def v2_playbook_on_stats(self, stats):
|
|
"""Display info about playbook statistics"""
|
|
|
|
hosts = sorted(stats.processed.keys())
|
|
|
|
summary = {}
|
|
for h in hosts:
|
|
s = stats.summarize(h)
|
|
summary[h] = s
|
|
|
|
output = {
|
|
'plays': self.results,
|
|
'stats': summary
|
|
}
|
|
|
|
self._display.display(json.dumps(output, indent=4, sort_keys=True))
|
|
|
|
v2_runner_on_failed = v2_runner_on_ok
|
|
v2_runner_on_unreachable = v2_runner_on_ok
|
|
v2_runner_on_skipped = v2_runner_on_ok
|