Using the Ansible Python API, how can I get access to task level outputs in my code? -


i use playbook runner so:

stats = callbacks.aggregatestats()                                            playbook_cb = callbacks.playbookcallbacks(verbose=1)            runner_cb = callbacks.playbookrunnercallbacks(stats, verbose=1)                                   pb = ansible.playbook.playbook( ... # basic info )                                                                           results = pb.run() 

the results variable contains output following:

{"status": 1, "result": {"127.0.0.1": {"unreachable": 0, "skipped": 0, "ok": 3, "changed": 2, "failures": 0}}} 

which fine. need task level output dict shown below:

changed: [127.0.0.1] => {"changed": true, "name": "apache2", "state": "started"} 

i tried changing verbosity, not wanted.

after digging around managed output log file so:

from ansible import constants c c.default_log_path = 'project.log' reload(callbacks) 

but need access in code.

you can't json format wanted, can same information extending callback classes , write own handlers events interested.

also make sure give classes playbook instance this:

pb = ansible.playbook.playbook(     ... # basic info     callbacks= playbook_cb,     runner_callbacks=runner_cb )         

links:

edit: in case solution extend aggregatestat class instead. code examples below provided @tom_sawyyer

from ansible.callbacks import aggregatestats                                   class customaggregatestats(aggregatestats):                                          """                                                                              holds stats per-host activity during playbook runs.                        """                                                                              def __init__(self):                                                                  super(customaggregatestats, self).__init__()                                     self.results = {}                                                             def compute(self, runner_results, setup=false, poll=false,                                   ignore_errors=false):                                                    """                                                                              walk through results , increment stats.                                    """                                                                              super(customaggregatestats, self).compute(runner_results, setup, poll,                                                  ignore_errors)                          (host, value) in runner_results.get('contacted', {}).iteritems():                if 'invocation' in value:                                                            if value['invocation']['module_name'] == 'service':                             self.results['service_name'] = value['name']                          def summarize(self, host):                                                           """                                                                              return information particular host                                       """                                                                              summarized_info = super(customaggregatestats, self).summarize(host)               # adding info need                                                         summarized_info['result'] = self.results                                          return summarized_info 

and finally:

my_stats = customaggregatestats() pb = ansible.playbook.playbook(     ... # basic info     stats=my_stats, )      

giving output:

{"127.0.0.1": {"skipped": 0, "ok": 3, "changed": 2, "result": {"service_name": "apache2"}, "failures": 0, "unreachable": 0}}