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

 #!/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的更多相关文章

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

    自动化运维工具:ansible 多进程调用ansible api的应用场景:   应用系统检查 一个应用系统可能具有20—50台服务器的集群,初步的系统层面检查可以用一个统一的playbook来检查, ...

  2. Python调用ansible API系列(三)带有callback的执行adhoc和playbook

    在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...

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

    Python 3.6.0的sqlite3模块存在一个bug(见issue 29003),无法执行VACUUM语句. 一执行就出现异常: Traceback (most recent call last ...

  4. Ansible系列(七):执行过程分析、异步模式和速度优化

    本文目录:1.1 ansible执行过程分析1.2 ansible并发和异步1.3 ansible的-t选项妙用1.4 优化ansible速度 1.4.1 设置ansible开启ssh长连接 1.4. ...

  5. Python之多线程和多进程

    一.多线程 1.顺序执行单个线程,注意要顺序执行的话,需要用join. #coding=utf-8 from threading import Thread import time def my_co ...

  6. Python进阶(4)_进程与线程 (python并发编程之多进程)

    一.python并发编程之多进程 1.1 multiprocessing模块介绍 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大 ...

  7. Ansible 2.0公布

    本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/02/ansible-2-released 经过了一年的开发工作后,Ansib ...

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

    一.什么是ad-hoc和playbook  ad-hoc : 如果我们敲入一些命令去快速的完成一些操作,而不需要将这些执行过的命令刻意保存下来,这样的命令就叫做as-hoc命令,这里不做过多赘述. p ...

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

    Python 3.8.0 正式版发布,新特性初体验 北京时间 10 月 15 日,Python 官方发布了 3.8.0 正式版,该版本较 3.7 版本再次带来了多个非常实用的新特性. 赋值表达式 PE ...

随机推荐

  1. javascript编程代码笔记

    1. 快速排序算法 方法一 function quicksort(n,left,right){ var p; if(left<right){ p = position(n,left,right) ...

  2. SSH框架 spring 配置中的: scope="prototype"

    "可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理, 避免struts中Action的线程安全问题." 这句话怎么 ...

  3. OpenStack(企业私有云)万里长征第五步——虚拟机Migrate&Resize

    一.前言 上一篇文章讲了OpenStack的部署和简单操作,今天介绍一下如何实现虚拟机的Migrate以及Resize.Migrate操作和Resize操作基本上属于同一种操作,Migrate操作只是 ...

  4. Java Jpa 规范

    Jpa最早是EJB3.0里面的内容,JSR 220: Enterprise JavaBeansTM 3.0 https://www.jcp.org/en/jsr/detail?id=220 后来大约在 ...

  5. MyBatis源码解析【6】SqlSession运行

    前言 这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客 http://www.cnblogs.com/linkstar/category/1027239.html 经过之前的学习我们知 ...

  6. CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划)

    CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划) Description 字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我们有很多的操作定义,因 ...

  7. 还在为画“类Word文档报表”而发愁吗?

    欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~​ Word 是非常强大的文档编辑工具,一些行业制式文档都是使用Word来创建的,像教育行业的申请表,履历表,审批表等,像石油业的 ...

  8. net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎

    序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题: 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜 ...

  9. Java使用拦截器的两种方式

    拦截器是个好东西,之前用到过,现在记录一下,供以后参考使用! 其一,使用org.aspectj.lang.annotation.Aspect 先上代码: package com.test.interc ...

  10. 开源个.NetCore写的 - 并发请求工具PressureTool

    本篇和大家分享的是一个 并发请求工具,并发往往代表的就是压力,对于一些订单量比较多的公司这种情况很普遍,也因此出现了很多应对并发的解决方案如:分布式,队列,数据库锁等: 对于没有遇到过或者不可能线上来 ...