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

  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‘)

   

     

时间: 2024-11-09 06:24:22

python-ansible api2.0 多进程执行不同的playbook的相关文章

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

Python 3.6.0的sqlite3模块无法执行VACUUM语句

Python 3.6.0的sqlite3模块存在一个bug(见issue 29003),无法执行VACUUM语句. 一执行就出现异常: Traceback (most recent call last):  File "D:\desktop\cannot_vacuum.py", line 25, in <module>    conn.execute('VACUUM')sqlite3.OperationalError: cannot VACUUM from within a

python并发编程之多进程

python并发编程之多进程 一.什么是进程 进程:正在进行的一个过程或者一个任务,执行任务的是CPU. 原理:单核加多道技术 二.进程与程序的区别 进程是指程序的运行过程 需要强调的是:同一个程序执行两次是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放苍井空,另一个可以播放武藤兰. 三.并发与并行 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务. (1)并发

Python的多线程与多进程实践

最近要产生大量的”假“的电话号码,所以就写了一个自动产生电话号码程序,产生了一百万条数据,然后把数据放到一个文件中. 死跑版: # -*- coding: utf-8 -*- # 以下是中国的手机号码分段情况 # 新联通 (中国联通+中国网通)手机号码开头数字 130.131.132.145. # 155.156.185.186 # 新移动 (中国移动+中国铁通)手机号码开头数字 134.135.136.137. # 138.139.147.150.151.152.157.158.159.182

python使用multiprocessing进行多进程编程(1)

multiprocessing模块实现了对多进程编程的封装,让我们可以非常方便的使用多进程进行编程.它的使用方法非常类似threading模块. 1.创建一个进程 import multiprocessing def worker(): """worker function""" print 'Worker' return if __name__ == '__main__': jobs = [] for i in range(5): p = mu

Python API 2.0

Python API 2.0从2.0的事情开始更复杂一些,但是你会得到更多离散和可读的类: #!/usr/bin/env python import jsonfrom collections import namedtuplefrom ansible.parsing.dataloader import DataLoaderfrom ansible.vars import VariableManagerfrom ansible.inventory import Inventoryfrom ansi

ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数

一.什么是ad-hoc和playbook  ad-hoc : 如果我们敲入一些命令去快速的完成一些操作,而不需要将这些执行过的命令刻意保存下来,这样的命令就叫做as-hoc命令,这里不做过多赘述. playbook : 简单的说,playbook是一种简单的配置管理系统与多机器部署系统的基础.与现有的其它系统有不同之处,且非常适用于复杂的应用部署.playbook可适用于声明配置,更强大的地方在于playbook中可以编排有序的执行过程,甚至于做到在多组机器间来回有序的执行特别指定的步骤,并且可

python并发编程02/多进程

目录 python并发编程02/多进程 1.进程创建的两种方式 1.1开启进程的第一种方式 1.2开启进程的第二种方式 1.3简单应用 2.进程pid 2.1命令行获取所有的进程的pid tasklist 2.2代码级别如何获取一个进程的pid 2.3获取父进程(主进程)的pid 3.验证进程之间的空间隔离 4.进程对象join方法 5.进程对象其他属性 6.守护进程 python并发编程02/多进程 1.进程创建的两种方式 1.1开启进程的第一种方式 from multiProcessing

Python 3.8.0 正式版发布,新特性初体验 全面介绍

Python 3.8.0 正式版发布,新特性初体验 北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PEP 572: Assignment Expressions 新增一种新语法形式::=,又称为"海象运算符"(为什么叫海象,看看这两个符号像不像颜表情),如果你用过 Go 语言,应该对这个语法非常熟悉. 具体作用我们直接用实例来展示,比如在使用正则匹配时,以往版本中我们会如下写: impor