#coding: utf-8
importosimportsysfrom collections importnamedtuplefrom ansible.parsing.dataloader importDataLoaderfrom ansible.vars.manager importVariableManagerfrom ansible.inventory.manager importInventoryManagerfrom ansible.executor.playbook_executor importPlaybookExecutorfrom ansible.playbook.play importPlayfrom ansible.executor.task_queue_manager importTaskQueueManagerfrom ansible.plugins.callback importCallbackBase#存放yml的目录
YML_DIR = ''
classansible_Runner(object):"""This is a General object for parallel execute modules."""
def __init__(self, resource, *args, **kwargs):
self.resource=resource
self.inventory=None
self.variable_manager=None
self.loader=None
self.options=None
self.passwords=None
self.callback=None
self.__initializeData()
self.results_raw={}def __initializeData(self):"""初始化ansible配置"""Options= namedtuple('Options',
['listtags', 'listtasks', 'listhosts', 'syntax', 'connection', 'module_path', 'forks','remote_user', 'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args','scp_extra_args', 'become', 'become_method', 'become_user', 'verbosity', 'check', 'diff'])
self.loader=DataLoader()
self.options= Options(listtags=False, listtasks=False, listhosts=False, syntax=False, connection='ssh',
module_path=None, forks=100, remote_user='root', private_key_file=None,
ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None,
become=True, become_method='sudo', become_user='root', verbosity=None, check=False,
diff=False)
self.passwords= dict(vault_pass='secret')
self.inventory= InventoryManager(loader=self.loader, sources=self.resource)
self.variable_manager= VariableManager(loader=self.loader, inventory=self.inventory)defrun(self, host_list, module_name, module_args, ):"""run module from andible ad-hoc.
module_name: ansible module_name
module_args: ansible module args"""play_source=dict(
name="Ansible Ad-hoc Command",
hosts=host_list,
gather_facts='no',
tasks=[dict(action=dict(module=module_name, args=module_args))]
)
play= Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader)
tqm=None
self.callback=ResultsCollector()try:
tqm=TaskQueueManager(
inventory=self.inventory,
variable_manager=self.variable_manager,
loader=self.loader,
options=self.options,
passwords=self.passwords,
stdout_callback='default',
)
tqm._stdout_callback=self.callback
result=tqm.run(play)#print self.callback
finally:if tqm is notNone:
tqm.cleanup()defrun_playbook(self, playbook_name):try:
self.callback=ResultsCollector()
playbook_file= [YML_DIR +playbook_name]print(playbook_file)#template_file = BASE_DIR + "roles/"+ role_name + "/templates"
if notos.path.exists(playbook_name):print('%s 路径不存在' %playbook_file)
sys.exit()
executor=PlaybookExecutor(
playbooks=playbook_file, inventory=self.inventory, variable_manager=self.variable_manager,
loader=self.loader,options=self.options, passwords=self.passwords
)
executor._tqm._stdout_callback=self.callback
executor.run()exceptException as e:print("Failure in run_playbook:%s"%e)pass
defget_result(self):
self.results_raw= {'success': {}, 'failed': {}, 'unreachable': {}}for host, result inself.callback.host_ok.items():
self.results_raw['success'][host] =result._resultfor host, result inself.callback.host_failed.items():
self.results_raw['failed'][host] =result._resultfor host, result inself.callback.host_unreachable.items():
self.results_raw['unreachable'][host] = result._result['msg']returnself.results_rawclassResultsCollector(CallbackBase):def __init__(self, *args, **kwargs):
super(ResultsCollector, self).__init__(*args, **kwargs)
self.host_ok={}
self.host_unreachable={}
self.host_failed={}defv2_runner_on_unreachable(self, result):
self.host_unreachable[result._host.get_name()]=resultdef v2_runner_on_ok(self, result, *args, **kwargs):
self.host_ok[result._host.get_name()]=resultdef v2_runner_on_failed(self, result, *args, **kwargs):
self.host_failed[result._host.get_name()]= result