ansible 2.7 API

# coding:utf-8

# @Time    : 2019-01-14 15:22
# @Author  : 小贰
# @FileName: ansible_sync_hosts.py
# @function: About ansible 2.7 API

import json
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase

class ResultsCollector(CallbackBase):
    """重构执行结果"""
    def __init__(self, *args, **kwargs):
        super(ResultsCollector, self).__init__(*args, **kwargs)
        self.host_ok = {}
        self.host_unreachable = {}
        self.host_failed = {}

    def v2_runner_on_unreachable(self, result, *args, **kwargs):
        """不可达"""
        self.host_unreachable[result._host.get_name()] = result

    def v2_runner_on_ok(self, result, *args, **kwargs):
        """执行成功"""
        self.host_ok[result._host.get_name()] = result

    def v2_runner_on_failed(self, result, *args, **kwargs):
        """执行失败"""
        self.host_failed[result._host.get_name()] = result

def run_ansible(module_name,module_args,host_list,option_dict):
    # 初始化需要的对象
    Options = namedtuple(‘Options‘,
                         [‘connection‘, ‘module_path‘, ‘forks‘, ‘become‘,
                          ‘become_method‘, ‘private_key_file‘,‘become_user‘,
                          ‘remote_user‘, ‘check‘, ‘diff‘]
                         )
    #负责查找和读取yaml、json和ini文件
    loader = DataLoader()

    options = Options(connection=‘ssh‘, module_path=None, forks=5, become=option_dict[‘become‘],
                      become_method=‘sudo‘,private_key_file="/root/.ssh/id_rsa",
                      become_user=‘root‘, remote_user=option_dict[‘remote_user‘], check=False, diff=False
                      )

    passwords = dict(vault_pass=‘secret‘)

    # 实例化ResultCallback来处理结果
    callback = ResultsCollector()

    # 创建库存(inventory)并传递给VariableManager
    inventory = InventoryManager(loader=loader, sources=[‘/etc/ansible/hosts‘])
    variable_manager = VariableManager(loader=loader, inventory=inventory)

    # 创建任务
    host = ",".join(host_list)
    play_source = dict(
        name="Ansible Play",
        hosts=host,
        gather_facts=‘no‘,
        tasks=[
            dict(action=dict(module=module_name, args=module_args), register=‘shell_out‘),
        ]
    )
    play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

    # 开始执行
    tqm = None

    tqm = TaskQueueManager(
        inventory=inventory,
        variable_manager=variable_manager,
        loader=loader,
        options=options,
        passwords=passwords,
        stdout_callback=callback,
    )
    result = tqm.run(play)

    result_raw = {‘success‘: {}, ‘failed‘: {}, ‘unreachable‘: {}}

    for host, result in callback.host_ok.items():
        result_raw[‘success‘][host] = result._result[‘stdout_lines‘]

    for host, result in callback.host_failed.items():
        result_raw[‘failed‘][host] = result._result[‘stderr_lines‘]

    for host, result in callback.host_unreachable.items():
        result_raw[‘unreachable‘][host] = result._result["msg"]

    return json.dumps(result_raw, indent=4)

if __name__ == "__main__":
    option_dict={"become":True,"remote_user":"opadmin"}
    module_name = ‘shell‘
    module_args = "ls /root"
    host_list = [‘192.168.1.191‘,‘192.168.1.190‘]
    ret = run_ansible(module_name,module_args,host_list,option_dict)
    print(ret)

原文地址:https://www.cnblogs.com/xiao2er/p/10267696.html

时间: 2024-11-11 21:21:38

ansible 2.7 API的相关文章

自动化运维工具Ansible之Python API

Ansible 的Python API使用起来相当简单快捷,使用API可以将某些运维操作封装成一个带有WEB界面的操作,免去了每次执行某个操作的时候都需要SSH运行Ansible命令. 官方给出的一个简单示例: import ansible.runner          runner = ansible.runner.Runner(        module_name='ping',        module_args='',        pattern='web*',        f

用Flask封装下Ansible提供后端API

Ansible是作为自动化运维的底层实现,功能很强大,但需要通过命令或playbook的yaml文件来实现,相对对运维人员而言,学习成本过大.所以这里要考虑到通过Flask Web框架来实现其二次封装,提供HTTP接口来实现远程调用.但我们在请求Ansbile API的时候,ansible默认本身是阻塞的,用户那边会一直处于等待状态,这样大家的用户体验也不好,所以这里会用rq来实现其非阻塞功能,即实现任务的异步化. 使用的开源软件 Ansible Flask redis redis-rq 代码地

Ansible AdHoc & playbook API + 动态生成Inventory +结果关注

为以后用的方便,记录一下(主要是怕忘,又得折腾半天) 直接贴代码,没太多注释,看不懂的看下源码.Pycharm+b Ansible 2.0 之后的 API 比 2.0 之前要复杂,但使用起来的自由度更好,可根据自己需求修改 Ansible API 的使用方法:功能也更强大. 我主要是使用这个 API 配合 Djcelery 实现监控系统的数据采集功能,好处是不再需要每中服务器再开发一个agent.这样使用的问题可能主要是程序的负载性能及程序并发性能,我还没测试. -- coding:utf8 -

自动化运维工具Ansible之动态inventory文件

去年的时候开发了一个自动化运维的小系统,用的就是Ansible 的python API,其中动态从数据库获取主机组合主机变量的功能,着实费了老大的劲,最后用了个很鸡肋的方法实现了.最近几个月把Ansible的官方文档通看了一遍,哎,想死的心都有了,文档里面已经写的很清楚如何实现动态inventory文件了,就怪当时自己太着急,没仔细看文档. 自己开发的动态inventory脚本文件,只需要支持两个参数即可: --list 返回所有的主机组信息,每个组都应该包含字典形式的主机列表,子组列表,如果需

Ansible的playbook的基本使用与快速入门

1.使用playbook有什么好处2.认识playbook(自动部署nginx)3.YAML语法4.playbook文件结构5.在变更时执行操作(handlers)6.任务控制(tags)7.playbook文件调试8.案例:自动部署tomcat9.Playbook变量定义与使用 playbok文件复用 1. 使用playbook有什么好处 Ansible真正的能力在于使用playbook,也就称为剧本 当我们在某个目录下执行某个命令的时候,那么我们可以使用ansible的ad hoc的模式快速

[转帖]Breeze部署kubernetes1.13.2高可用集群

Breeze部署kubernetes1.13.2高可用集群 2019年07月23日 10:51:41 willblog 阅读数 673 标签: kubernetes 更多 个人分类: kubernetes https://blog.csdn.net/networken/article/details/86550735 所知道的太少了.. 不过简单试了下 不是特别好用 国内公司做的系统.. 也可能跟我的虚拟机兼容性有关系.. breeze简介 项目地址:https://github.com/wis

#IT明星不是梦# 自动化平台的构建与zabbix二次开发那些事

在前东家,我对于运维平台重新做了二次的改造,当然基于zabbix平台的功能也在不断的完善,相对于之前的基础架构,我们这次采用vue + element的前端架构,出图使用的是echart的方式.后端我们使用了restful的标准通信框架. 自动化架构 1.当然在讲到zabbix之前我们先看一下我们之前在老东家的时候做的相关的一些平台操作: 平台相关注解: 底层的数据主要使用CMDB来进行管理,CMDB开放APi接口给上层的发布系统.DB系统:当然各个子系统对接都是有权限审计. 数据录入统一使用脚

Ansible playbook API 开发 调用测试

Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible的二次开发. 随笔的内容分为三个部分 playbook编辑执行 python 调用API执行playbook java调用python程序进行playbook的执行 实验的环境是centos6,ansible版本是1.9.4,python版本是2.6.6,jdk版本是1.7U79 一.playboo

ansible python api 2.0使用

最近想利用python来调用anbile来实现一些功能,发现ansible的api已经升级到了2.0,使用上比以前复杂了许多. 这里我参考了官方文档的例子,做了一些整改,写了一个python调用ansible的函数,执行过程中输出执行结果.函数返回执行结果,便于筛选和存储所需的数据: # vim exec_ansible.py def exec_ansible(module,args,host):         import json     from collections import n