python-ansible api2.0 多进程执行不同的playbook
- 自动化运维工具:ansible
- 多进程调用ansible api的应用场景: 应用系统检查
- 一个应用系统可能具有20—50台服务器的集群,初步的系统层面检查可以用一个统一的playbook来检查,比如(df -h这种命令)。但是深入到应用层的话,就有些个性化的应用了,比如有2台http服务器,有20台中间件服务器在加4台数据库服务器等等,检查项都是不同的。如果现在还要进行批量的系统检查,就不能用同一个playbook了。另外,如果顺序执行的话,等待时间就会非常长,而且没有必要,因为中间件的检查和数据库的检查没有必然的先后顺序的要求,可以同步执行。
- 所以因为上述的场景需求,导致我们需要多进程调用ansible api来动态生成Inventory并执行不同的playbook。
- 实现步骤
- 基于ansible python api 2.0 二次开发,封装接口
- 创建多个ansible 对象,不同的inventory 不同的playbook
- 创建多进程,执行程序
- 注意事项
- ansible api2.0 相较于1.0复杂了许多,也更加灵活。这个需要去阅读原代码,需要多花点时间和耐心
- 在用多进程之前,我尝试使用多线程,这块好像ansible不支持threading ,所以就用multiprocessing代替
- 代码
AnsibleAPI.py
#!/usr/bin/env python
# coding=utf-8
import json
import logging
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.plugins.callback import CallbackBase
from collections import namedtuple
from ansible import constants as C
import ansible.executor.task_result
import multiprocessing class ResultsCollector(CallbackBase): def v2_runner_on_ok(self, result):
host = result._host
logging.warning('===v2_runner_on_ok====host=%s===result=%s' % (host, result._result)) def v2_runner_on_failed(self, result, ignore_errors=False):
host = result._host
logging.warning('===v2_runner_on_failed====host=%s===result=%s' % (host, result._result)) def v2_runner_on_unreachable(self, result):
host = result._host
logging.warning('===v2_runner_on_unreachable====host=%s===result=%s' % (host, result._result)) class AnsibleAPI(object):
def __init__(self, hostlist, playbooks, *args, **kwargs):
self.hostlist = hostlist
self.playbooks = playbooks
self.passwords = None
self.callback = None
Options = namedtuple('Options', ['connection', 'remote_user', 'ask_sudo_pass', 'verbosity', 'ack_pass',
'module_path', 'forks', 'become', 'become_method', 'become_user',
'check', 'listhosts', 'listtasks', 'listtags', 'syntax',
'sudo_user', 'sudo', 'display_skipped_hosts']) self.options = Options(connection='smart', remote_user='root', ack_pass=None, sudo_user='root',
forks=200, sudo='yes', ask_sudo_pass=False, verbosity=5, module_path=None,
become=True, become_method='su', become_user='root', check=None, listhosts=False,
listtasks=False, listtags=None, syntax=None, display_skipped_hosts=False)
self.loader = DataLoader()
self.variable_manager = VariableManager()
self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager,
host_list=self.hostlist)
self.variable_manager.set_inventory(self.inventory)
self.variable_manager.extra_vars = {"ansible_ssh_user": "root"} # 额外参数,包括playbook参数 key:value def runplaybook(self):
playbook = PlaybookExecutor(
playbooks=self.playbooks,
inventory=self.inventory,
variable_manager=self.variable_manager,
loader=self.loader,
options=self.options,
passwords=None)
playbook._tqm._stdout_callback = ResultsCollector()
playbook.run() if __name__ == '__main__':
#创建对象
anl = AnsibleAPI(['10.26.222.216'], ['/root/ansibleInventory_cl/df.yml'])
an2 = AnsibleAPI(['10.26.222.210', '10.26.222.213'], ['/root/ansibleInventory_cl/ifconfig.yml'])
#多进程
processes = []
p1 = multiprocessing.Process(name='process_one', target=anl.runplaybook)
p2 = multiprocessing.Process(name='process_two', target=an2.runplaybook)
processes.append(p1)
processes.append(p2)
for p in processes:
p.start() print('tasks completed')
python-ansible api2.0 多进程执行不同的playbook的更多相关文章
- ansible api2.0 多进程执行不同的playbook
自动化运维工具:ansible 多进程调用ansible api的应用场景: 应用系统检查 一个应用系统可能具有20—50台服务器的集群,初步的系统层面检查可以用一个统一的playbook来检查, ...
- Python调用ansible API系列(三)带有callback的执行adhoc和playbook
在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...
- Python 3.6.0的sqlite3模块无法执行VACUUM语句
Python 3.6.0的sqlite3模块存在一个bug(见issue 29003),无法执行VACUUM语句. 一执行就出现异常: Traceback (most recent call last ...
- Ansible系列(七):执行过程分析、异步模式和速度优化
本文目录:1.1 ansible执行过程分析1.2 ansible并发和异步1.3 ansible的-t选项妙用1.4 优化ansible速度 1.4.1 设置ansible开启ssh长连接 1.4. ...
- Python之多线程和多进程
一.多线程 1.顺序执行单个线程,注意要顺序执行的话,需要用join. #coding=utf-8 from threading import Thread import time def my_co ...
- Python进阶(4)_进程与线程 (python并发编程之多进程)
一.python并发编程之多进程 1.1 multiprocessing模块介绍 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大 ...
- Ansible 2.0公布
本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/02/ansible-2-released 经过了一年的开发工作后,Ansib ...
- ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数
一.什么是ad-hoc和playbook ad-hoc : 如果我们敲入一些命令去快速的完成一些操作,而不需要将这些执行过的命令刻意保存下来,这样的命令就叫做as-hoc命令,这里不做过多赘述. p ...
- Python 3.8.0 正式版发布,新特性初体验 全面介绍
Python 3.8.0 正式版发布,新特性初体验 北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PE ...
随机推荐
- Java 异常处理笔记
Java程序运行过程中所发生的异常事件可分为两类: §错误(Error):JVM系统内部错误.资源耗尽等严重情况 §违例(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,例如: ...
- Eclipse工程有乱码
处理:把整个工程的“Text file encoding”属性设为GBK,就不会有乱码了.设置方法:在eclipse中右击工程,点击弹出框最下面的“Properties”,然后在弹出的窗口左侧点击“R ...
- 终于等到你!MobileTest免费公测,华为带你走出安卓适配大坑
一.安卓适配之痛真的无解吗? Android平台的诞生对智能手机的普及功不可没,但设备繁多.品牌众多.版本各异,芯片.摄像头.分辨率不统一等等,这些都逐渐成为Android系统发展的障碍,碎片化严重不 ...
- select2 4.0.3 空记录时的处理
使用select2插件,如果后台查找没有记录,不能返回null,要返回一个空数组,不然会报错:data is null 空数组形式为(firefox调试输出):{"items":[ ...
- css的背景background的相关属性
今天需要做一个占满设备宽度的轮播图,这里作为demo仅展示一张图,下面分别是要操作的图片(这里做了缩放处理,实际的图比较大),以及要实现的效果图,很明显两者是不成比例的: (图一) ...
- swift 3.0 基础练习 面向对象 类的扩展
要求 为NSString类添加split功能 为NSString类添加一个函数func split(splitStr: NSString)-> [NSString],split是把字符串以特定的 ...
- docker - 由于docker swarm子网与host机器网络冲突导致的container通信问题的解决方案
背景 近期,公司网络要迁移到新的网段,所以原来在服务器上面搭建的docker swarm需要重新构建... 拿到新的服务器地址看了一下,“10.xxx.xxx.xxx" ... 纳尼,这IP ...
- 【css】盒子模型 之 概述
摘要 一些基本的概念以及常见使用问题 概述 BFC 是css 中布局的核心 - 盒模型,根据块级元素及行级元素可分为块级容器, 行级容器,但容器内部都遵循 BFC BFC 空间布局 备注: IE 的盒 ...
- 【HTML】谈谈html的meta标签
一.定义&用法 <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头 ...
- 任务调度---crontab
1. crontab相当于windows下的任务与计划,可以设定定时任务,周期执行的任务 2. 设置任务调度文件 crontab -e 进入任务界面,添加如下命令 0 2 * * ...