ansible python api接口操作并在指定阶段灵活嵌入自定义的任务

# -*- 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值