#!/usr/bin/python3 -tt # Author: Toshio Kuratomi # Copyright: December 2015, November 2016 # License: LGPLv3+ import sys import copy import itertools from ansible import plugins from ansible.errors import AnsibleOptionsError from ansible.plugins.callback import CallbackBase from ansible.plugins.callback import default from ansible.cli.adhoc import AdHocCLI class ResultAccumulator(CallbackBase): CALLBACK_VERSION = 2.0 CALLBACK_NAME = 'accumulator' def __init__(self, *args, **kwargs): super(ResultAccumulator, self).__init__(*args, **kwargs) self.unreachable = set() self.host_status = {} def v2_runner_on_unreachable(self, result): self.unreachable.add(result._host.get_name()) def v2_runner_on_ok(self, result, *args, **kwargs): for vm in result._result.keys(): if not '.fedoraproject.org' in vm: # Seemingly, Ansible keeps adding more random keys to the # result dict every time, so let's just kill the tailing # once and for all. If it doesn't look like a hostname, ignore. continue self.host_status[(result._host.get_name(), vm)] = (result._result[vm]['state'], str(result._result[vm]['autostart'])) if __name__ == '__main__': args = copy.copy(sys.argv) args.extend(['-m', 'virt', '-a', 'command=info']) cb = ResultAccumulator() cli = AdHocCLI(copy.copy(args), callback=cb) try: cli.parse() except AnsibleOptionsError: if len(cli.args) != 1: cli.args = copy.copy(args) cli.args.append('virtservers') cli.parse() cli.run() for host in cb.unreachable: sys.stderr.write('unreachable: %s\n' % host) for host, status in sorted(cb.host_status.items()): print(':'.join(itertools.chain(host, status)))