import argparse import json import logging from ansible.module_utils.common.collections import ImmutableDict from ansible.inventory.manager import InventoryManager from ansible.parsing.dataloader import DataLoader from ansible.vars.manager import VariableManager from ansible import context from ansible.executor.playbook_executor import PlaybookExecutor from ansible.plugins.callback import CallbackBase
logging.basicConfig(level=logging.DEBUG,format="%(asctime)s %(levelname)s %(message)s")
class ResultsCallback(CallbackBase): def __init__(self,*args,**kwargs): super(ResultsCallback,self).__init__(*args,**kwargs) self.task_ok = {} self.task_failed = {} self.task_skipped = {} self.task_status = {} self.task_unreachable = {}
def v2_runner_on_ok(self, result, *args, **kwargs): self.task_ok[result.task_name] = result._result
def v2_runner_on_failed(self, result, *args, **kwargs): self.task_failed[result.task_name] = result._result
def v2_runner_on_skipped(self, result, *args, **kwargs): self.task_skipped[result.task_name] = result._result
def v2_runner_on_status(self, result, *args, **kwargs): self.task_status[result.task_name] = result._result
def v2_runner_on_unreachable(self, result, *args, **kwargs): self.task_unreachable[result.task_name] = result._result
class AnsibleApi: def __init__(self): self.parse_arguments() self.init_context()
def init_context(self): context.CLIARGS = ImmutableDict( connection='smart', module_path=['library'], forks=10, become=None, become_method=None, become_user=None, check=False, diff=False, verbosity=0 )
def parse_arguments(self): parser = argparse.ArgumentParser(description='Ansible API') parser.add_argument('--host', type=str, help='') parser.add_argument('--username', type=str, help='') parser.add_argument('--password', type=str, help='') parser.add_argument('--jdk_version', type=str, help='') parser.add_argument('--system_name', type=str, help='') parser.add_argument('--env_type', type=str, help='') parser.add_argument('--deploy_type', type=str, help='') parser.add_argument('--action', type=str, help='') self.args = vars(parser.parse_args())
def get_variable(self): loader = DataLoader() inventory = InventoryManager(loader=loader, sources='inventory/hosts') variable_manager = VariableManager(loader=loader, inventory=inventory) host = self.args['host'] inventory.add_host(host, group='all') variable_manager.set_host_variable(host, 'ansible_ssh_user', self.args['username']) variable_manager.set_host_variable(host, 'ansible_ssh_pass', self.args['password']) variable_manager.set_host_variable(host, varname='user', value={'username': self.args['username'], 'home': '/home/{}'.format(self.args['username'])}) for key,value in self.args.items(): variable_manager.set_host_variable(host,key,value) return {"loader": loader, "inventory": inventory, "variable_manager": variable_manager}
def run_playbook(self): data = self.get_variable() loader, inventory, variable_manager = data['loader'], data['inventory'], data['variable_manager'] pbex = PlaybookExecutor( playbooks=['{}.yml'.format(self.args['action'])], inventory=inventory, variable_manager=variable_manager, loader=loader, passwords=None ) return pbex
def get_result(self): pbex = self.run_playbook() result_callback = ResultsCallback() pbex._tqm._callback_plugins.append(result_callback) pbex.run() task_failed = result_callback.task_failed task_unreachable = result_callback.task_unreachable if task_unreachable: raise Exception('task unreachable: {}'.format(json.dump(task_unreachable,indent=4))) elif task_failed: raise Exception('task failed: {}'.format(json.dump(task_failed, indent=4)))
if __name__ == '__main__': api = AnsibleApi() api.get_result()
|