# -*- coding: utf-8 -*-
import os
import sys
import yaml
import traceback
from collections import namedtuple
from optparse import OptionParser
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.inventory.manager import InventoryManager
from ansible.parsing.dataloader import DataLoader
from ansible.plugins.callback import CallbackBase
from ansible.vars.manager import VariableManager
from ansible.plugins.callback.default import CallbackModule
# sys.path.append("..")
from utils import *
class AnsibleTaskResultCallback(CallbackBase):
"""
ansible 回调和执行函数
"""
def __init__(self, playbook, *args, **kwargs):
"""
:playbook:
:param args:
:param kwargs:
"""
super(AnsibleTaskResultCallback, self).__init__(*args, **kwargs)
self.host_ok = {}
self.host_unreachable = {}
self.host_failed = {}
self.item_failed = {}
self.callback_module = CallbackModule()
self.playbook = playbook
self.env_dict = os.environ
self.trigger = self.env_dict['trigger']
def v2_playbook_on_stats(self, stats):
"""
整个剧本执行上线后的统计信息
:param stats:
:return:
"""
self.callback_module.v2_playbook_on_stats(stats)
ip_list = stats.processed.keys()
# 执行验证
# checker_res = self.execute_checker(ip_list)
def v2_runner_on_ok(self, result, **kwargs):
"""成功"""
self.callback_module.v2_runner_on_ok(result)
def v2_runner_item_on_ok(self, result):
"""
:return:
"""
self.callback_module.v2_runner_item_on_ok(result)
def v2_runner_on_failed(self, result, ignore_errors=False, **kwargs):
"""失败"""
self.callback_module.v2_runner_on_failed(result)
def v2_runner_item_on_failed(self, result):
"""运行单个task失败"""
self.callback_module.v2_runner_item_on_failed(result)
def v2_playbook_on_start(self, playbook):
"""
:return:
"""
self.callback_module.v2_playbook_on_start(playbook)
def v2_runner_retry(self, result):
"""
:return:
"""
self.callback_module.v2_runner_retry(result)
def v2_playbook_on_play_start(self, play):
"""
:return:
"""
self.callback_module.v2_playbook_on_play_start(play)
def v2_playbook_on_no_hosts_matched(self):
"""
:return:
"""
self.callback_module.v2_playbook_on_no_hosts_matched()
def v2_playbook_on_task_start(self, task, is_conditional):
"""
每个任务开始时候打印信息:此处可以在task执行前加一些预处理操作
:return:
"""
self.callback_module.v2_playbook_on_task_start(task, is_conditional)
task_name = task.name.strip()
def v2_playbook_on_cleanup_task_start(self, task):
"""
:param task:
:return:
"""
self.callback_module.v2_playbook_on_cleanup_task_start(task)
def v2_playbook_on_handler_task_start(self, task):
"""
:param task:
:return:
"""
self.callback_module.v2_playbook_on_handler_task_start(task)
class AnsibleTask(AnsibleTaskResultCallback):
"""
执行部署任务
"""
def __init__(self, ansible_host_path, playbook_path, vault_pass=None, *args, **kwargs):
"""
:param ansible_host_path:主机清单路径
:param playbook_path:playbook的路径
:param vault_pass:解密密码
:param args:
:param kwargs:
"""
super(AnsibleTask, self).__init__(playbook_path, *args, **kwargs)
self.ansible_host_path = ansible_host_path
self.playbook_path = playbook_path
self.vault_pass = vault_pass
def runner_playbook(self):
"""
运行playbook
"""
Options = namedtuple('Options',
['connection',
'module_path',
'forks',
#'private_key_file',
"become",
"become_method",
"become_user",
'check',
'diff',
"listhosts",
"listtasks",
"listtags",
"syntax"])
options = Options(connection='smart',
module_path=None,
forks=10,
#private_key_file="/home/admin/.ssh/id_rsa", # 你的私钥
# 提升执行权限
become=True,
become_method="sudo",
become_user="root",
check=False,
diff=False,
listhosts=None,
listtasks=None,
listtags=None,
syntax=None)
loader = DataLoader()
# results_callback = AnsibleTaskResultCallback(self.playbook_path)
# 解密使用的密码
passwords = dict(vault_pass=self.vault_pass)
inventory = InventoryManager(loader=loader, sources=[self.ansible_host_path])
variable_manager = VariableManager(loader=loader, inventory=inventory)
pbex = PlaybookExecutor(playbooks=[self.playbook_path],
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=passwords)
pbex._tqm._stdout_callback = AnsibleTaskResultCallback(self.playbook_path)
# setattr(getattr(pbex, '_tqm'), '_stdout_callback', results_callback)
results = pbex.run()
return results
if __name__ == "__main__":
parser = OptionParser()
# 主机清单列表文件
parser.add_option("-s", "--host_file", action="store", dest="host_file", default="")
# 剧本名称
parser.add_option("-p", "--play_book", action="store", dest="play_book", default="")
(options, args) = parser.parse_args()
ansible_host_path = os.path.abspath(options.host_file)
playbook_path = os.path.abspath(options.play_book)
ar = AnsibleTask(ansible_host_path, playbook_path)
data = ar.runner_playbook()
print(data)
ansible python api接口操作并在指定阶段灵活嵌入自定义的任务
最新推荐文章于 2024-07-28 00:25:22 发布