ansible api2.0 多进程执行不同的playbook

摘要:
如果现在要执行批处理系统检查,则不能使用相同的剧本。因此,由于上述场景需求,我们需要多个进程来调用ansibleapi,以动态生成Inventory并执行不同的剧本。实现步骤基于ansibleython api 2.0的二次开发,它封装了接口以创建多个可解析对象,并使用不同的清单和脚本来创建多个进程。Ansibleapi 2.0比1.0更复杂和灵活。
  1. 自动化运维工具:ansible
  2. 多进程调用ansible api的应用场景:   应用系统检查
    • 一个应用系统可能具有20—50台服务器的集群,初步的系统层面检查可以用一个统一的playbook来检查,比如(df -h这种命令)。但是深入到应用层的话,就有些个性化的应用了,比如有2台http服务器,有20台中间件服务器在加4台数据库服务器等等,检查项都是不同的。如果现在还要进行批量的系统检查,就不能用同一个playbook了。另外,如果顺序执行的话,等待时间就会非常长,而且没有必要,因为中间件的检查和数据库的检查没有必然的先后顺序的要求,可以同步执行。
    • 所以因为上述的场景需求,导致我们需要多进程调用ansible api来动态生成Inventory并执行不同的playbook
  3. 实现步骤
    1. 基于ansible python api 2.0 二次开发,封装接口
    2. 创建多个ansible 对象,不同的inventory 不同的playbook
    3. 创建多进程,执行程序 
  4. 注意事项
    1. ansible api2.0 相较于1.0复杂了许多,也更加灵活。这个需要去阅读原代码,需要多花点时间和耐心
    2. 在用多进程之前,我尝试使用多线程,这块好像ansible不支持threading ,所以就用multiprocessing代替
  5. 代码

 AnsibleAPI.py

 1 #!/usr/bin/env python
 2 # coding=utf-8
 3 import json
 4 import logging
 5 from ansible.parsing.dataloader import DataLoader
 6 from ansible.vars import VariableManager
 7 from ansible.inventory import Inventory
 8 from ansible.playbook.play import Play
 9 from ansible.executor.task_queue_manager import TaskQueueManager
10 from ansible.executor.playbook_executor import PlaybookExecutor
11 from ansible.plugins.callback import CallbackBase
12 from collections import namedtuple
13 from ansible import constants as C
14 import ansible.executor.task_result
15 import multiprocessing
16 
17 
18 class ResultsCollector(CallbackBase):
19 
20     def v2_runner_on_ok(self, result):
21         host = result._host
22         logging.warning('===v2_runner_on_ok====host=%s===result=%s' % (host, result._result))
23 
24 
25     def v2_runner_on_failed(self, result, ignore_errors=False):
26         host = result._host
27         logging.warning('===v2_runner_on_failed====host=%s===result=%s' % (host, result._result))
28 
29     def v2_runner_on_unreachable(self, result):
30         host = result._host
31         logging.warning('===v2_runner_on_unreachable====host=%s===result=%s' % (host, result._result))
32 
33 
34 class AnsibleAPI(object):
35     def __init__(self, hostlist, playbooks, *args, **kwargs):
36         self.hostlist = hostlist
37         self.playbooks = playbooks
38         self.passwords = None
39         self.callback = None
40         Options = namedtuple('Options', ['connection', 'remote_user', 'ask_sudo_pass', 'verbosity', 'ack_pass',
41                                          'module_path', 'forks', 'become', 'become_method', 'become_user',
42                                          'check', 'listhosts', 'listtasks', 'listtags', 'syntax',
43                                          'sudo_user', 'sudo', 'display_skipped_hosts'])
44 
45         self.options = Options(connection='smart', remote_user='root', ack_pass=None, sudo_user='root',
46                                forks=200, sudo='yes', ask_sudo_pass=False, verbosity=5, module_path=None,
47                                become=True, become_method='su', become_user='root', check=None, listhosts=False,
48                                listtasks=False, listtags=None, syntax=None, display_skipped_hosts=False)
49         self.loader = DataLoader()
50         self.variable_manager = VariableManager()
51         self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager,
52                                    host_list=self.hostlist)
53         self.variable_manager.set_inventory(self.inventory)
54         self.variable_manager.extra_vars = {"ansible_ssh_user": "root"}  # 额外参数,包括playbook参数 key:value
55 
56     def runplaybook(self):
57         playbook = PlaybookExecutor( 
58             playbooks=self.playbooks,
59             inventory=self.inventory,
60             variable_manager=self.variable_manager,
61             loader=self.loader,
62             options=self.options,
63             passwords=None)
64         playbook._tqm._stdout_callback = ResultsCollector()
65         playbook.run()
66 
67 if __name__ == '__main__':
68     #创建对象
69     anl = AnsibleAPI(['10.26.222.216'], ['/root/ansibleInventory_cl/df.yml'])
70     an2 = AnsibleAPI(['10.26.222.210', '10.26.222.213'], ['/root/ansibleInventory_cl/ifconfig.yml'])
71     #多进程
72     processes = []
73     p1 = multiprocessing.Process(name='process_one', target=anl.runplaybook)
74     p2 = multiprocessing.Process(name='process_two', target=an2.runplaybook)
75     processes.append(p1)
76     processes.append(p2)
77     for p in processes:
78         p.start()
79 
80     print('tasks completed')

   

     

免责声明:文章转载自《ansible api2.0 多进程执行不同的playbook》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ManualResetEvent 与 AutoResetEvent 的理解和使用程序实现AutoCAD Map3D 中的图形清理(MapClean)自动化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python+mitmproxy抓包过滤+redis消息订阅+websocket实时消息发送,日志实时输出到web界面

本实例实现需求 在游戏SDK测试中,经常需要测试游戏中SDK的埋点日志是否接入正确。本实例通过抓包(客户端http/https 请求)来判定埋点日志是是否接入正确。 实现细节:使用django项目,后端采用python mitmdump 扩展脚本“log_handler.py”实时抓取与过滤4399SDK 客户端日志,将数据处理成约定需要的格式,保存和发布...

curl使用

curl -H "Content-Type:application/json" -X POST --data '{"name":"zhangsan"}' http://127.0.0.1:9000/helloWorld curl命令用法: curl [options...] <url> 常用参数有: --connect-timeout <...

【软件安装】CentOS7安装MariaDb(mysql_替代品安装)

1、背景 Maria Db是流行的跨平台MySQL数据库管理系统的分支,被认为是MySQL 的完全替代品。Maria Db是由Sun在Sun Micro systems合并期间被Oracle收购后,于2009年由MySQL的一位原始开发人员创建的。今天,Maria Db由Maria Db Foundation和社区贡献者维护和开发, Maria Db将My...

Android CTS 测试总结【转】

Android CTS 测试总结【转】 最近一直在做Android兼容性测试,根据Android官网给出的android-cts-manual配置好了device后,开始测试。 首先配置软件环境: 1、下载Android-2.1系统,并编译。 $ . build/envsetup.sh //配置选项,并编译android源码$ make cts //a...

Ubuntu用户管理

本文主要介绍Ubuntu的用户管理,包括建立和删除用户,用户授权等 ==================创建用户并授权================== sudoadduser xxx 会在home目录下添加一个帐号 sudo useradd xxx 仅仅是添加用户, 不会在home目录添加帐号 1.1.添加用户,配置密码 sudoadduser aa...

Mysql 主从复制

mysql主从复制好处:1. 如果是单个数据库,如果挂了就凉凉2.主备数据库,挂了一台主库,我可能还有很多个备用的数据库2,读和写分开,减少了数据库的压力 实验准备:主机一(主) : 192.168.11.70主机二(从): 192.168.11.224都装有Mariadb 第一步-主机的操作: 1.在matser主库上的操作,开启主库功能先关闭服务sys...