1. #!/usr/bin/env python
  2. # -*- coding: utf8 -*-
  3. # @Author: huangmanyao
  4. from ansible import constants
  5. from collections import namedtuple
  6. from ansible.parsing.dataloader import DataLoader
  7. from ansible.playbook.play import Play
  8. from ansible.executor.task_queue_manager import TaskQueueManager
  9. from ansible.executor.playbook_executor import PlaybookExecutor
  10. from ansible.plugins.callback import CallbackBase
  11. from ansible.inventory.manager import InventoryManager
  12. from ansible.vars.manager import VariableManager
  13. import json
  14. import IPy
  15.  
  16. class ModelResultsCollector(CallbackBase):
  17. ''' 重构执行结果 '''
  18. def __init__(self, *args, **kwargs):
  19. super(ModelResultsCollector, self).__init__(*args, **kwargs)
  20. self.host_ok = {}
  21. self.host_unreachable = {}
  22. self.host_failed = {}
  23.  
  24. def v2_runner_on_unreachable(self, result):
  25. ''' 不可达 '''
  26. self.host_unreachable[result._host.get_name()] = result
  27.  
  28. def v2_runner_on_ok(self, result, *args, **kwargs):
  29. ''' 执行成功 '''
  30. self.host_ok[result._host.get_name()] = result
  31.  
  32. def v2_runner_on_failed(self, result, *args, **kwargs):
  33. ''' 执行失败 '''
  34. self.host_failed[result._host.get_name()] = result
  35.  
  36. class PlayBookResultsCollector(CallbackBase):
  37. CALLBACK_VERSION = 2.0
  38.  
  39. def __init__(self, *args, **kwargs):
  40. super(PlayBookResultsCollector, self).__init__(*args, **kwargs)
  41. self.task_ok = {}
  42. self.task_skipped = {}
  43. self.task_failed = {}
  44. self.task_status = {}
  45. self.task_unreachable = {}
  46.  
  47. def v2_runner_on_ok(self, result, *args, **kwargs):
  48. self.task_ok[result._host.get_name()] = result
  49.  
  50. def v2_runner_on_failed(self, result, *args, **kwargs):
  51. self.task_failed[result._host.get_name()] = result
  52.  
  53. def v2_runner_on_unreachable(self, result):
  54. self.task_unreachable[result._host.get_name()] = result
  55.  
  56. def v2_runner_on_skipped(self, result):
  57. self.task_ok[result._host.get_name()] = result
  58.  
  59. def v2_playbook_on_stats(self, stats):
  60. hosts = sorted(stats.processed.keys())
  61. for h in hosts:
  62. t = stats.summarize(h)
  63. self.task_status[h] = {
  64. "ok": t['ok'],
  65. "changed": t['changed'],
  66. "unreachable": t['unreachable'],
  67. "skipped": t['skipped'],
  68. "failed": t['failures']
  69. }
  70.  
  71. class ANSRunner(object):
  72. """
  73. This is a General object for parallel execute modules.
  74. """
  75.  
  76. def __init__(self, ips=None, *args, **kwargs):
  77. self.ips = ips
  78. self.inventory = None
  79. self.variable_manager = None
  80. self.loader = None
  81. self.options = None
  82. self.passwords = None
  83. self.callback = None
  84. self.__initializeData()
  85. self.results_raw = {}
  86.  
  87. def is_ip(self,address):
  88. try:
  89. IPy.IP(address)
  90. return True
  91. except Exception as e:
  92. return False
  93.  
  94. def list_to_str(self,ips):
  95. ipsstr = ','.join(ips)
  96. if len(ips) == 1:
  97. ipsstr += ','
  98. return ipsstr
  99.  
  100. def list_ip_check(self,ips):
  101. ipslist = ips
  102. ipslist_len = len(ips)
  103. if ipslist_len > 1:
  104. for ip in ipslist:
  105. if not self.is_ip(ip):
  106. ipslist.remove(ip)
  107. return ipslist
  108.  
  109. def ips_cov_str(self):
  110. if not self.ips:
  111. self.ips = "127.0.0.1"
  112.  
  113. if isinstance(self.ips,list):
  114. self.ips = self.list_ip_check(self.ips)
  115. self.ips = self.list_to_str(self.ips)
  116.  
  117. elif isinstance(self.ips,str):
  118. ipslist = self.ips.split(',')
  119. ipslist = self.list_ip_check(ipslist)
  120. self.ips = self.list_to_str(ipslist)
  121.  
  122. def __initializeData(self):
  123. """ 初始化ansible """
  124. Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'timeout', 'remote_user',
  125. 'ask_pass', 'private_key_file', 'ssh_common_args', 'ssh_extra_args',
  126. 'sftp_extra_args',
  127. 'scp_extra_args', 'become', 'become_method', 'become_user', 'ask_value_pass',
  128. 'verbosity',
  129. 'check', 'listhosts', 'listtasks', 'listtags', 'syntax', 'diff'])
  130.  
  131. self.options = Options(connection='smart', module_path=None, forks=100, timeout=10,
  132. remote_user='root', ask_pass=False, private_key_file=None, ssh_common_args=None,
  133. ssh_extra_args=None,
  134. sftp_extra_args=None, scp_extra_args=None, become=None, become_method=None,
  135. become_user='root', ask_value_pass=False, verbosity=None, check=False, listhosts=False,
  136. listtasks=False, listtags=False, syntax=False, diff=True)
  137.  
  138. self.loader = DataLoader()
  139. self.ips_cov_str()
  140. self.inventory = InventoryManager(loader=self.loader, sources='%s'%(self.ips))
  141. self.variable_manager = VariableManager(loader=self.loader, inventory=self.inventory)
  142.  
  143. def run_model(self, module_name, module_args):
  144. """
  145. run module from andible ad-hoc.
  146. module_name: ansible module_name
  147. module_args: ansible module args
  148. """
  149. self.ips_cov_str()
  150.  
  151. play_source = dict(
  152. name="Ansible Play",
  153. hosts=self.ips,
  154. gather_facts='no',
  155. tasks=[dict(action=dict(module=module_name, args=module_args))]
  156. )
  157.  
  158. play = Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader)
  159. tqm = None
  160. self.callback = ModelResultsCollector()
  161. import traceback
  162. try:
  163. tqm = TaskQueueManager(
  164. inventory=self.inventory,
  165. variable_manager=self.variable_manager,
  166. loader=self.loader,
  167. options=self.options,
  168. passwords=self.passwords,
  169. stdout_callback="minimal",
  170. )
  171. tqm._stdout_callback = self.callback
  172. constants.HOST_KEY_CHECKING = False # 关闭第一次使用ansible连接客户端是输入命令
  173. tqm.run(play)
  174. except Exception as err:
  175. print(traceback.print_exc())
  176. finally:
  177. if tqm is not None:
  178. tqm.cleanup()
  179.  
  180. def run_playbook(self, playbook_path, extra_vars=None):
  181. """
  182. 运行playbook
  183. """
  184. try:
  185. self.callback = PlayBookResultsCollector()
  186. if extra_vars:
  187. self.variable_manager.extra_vars = extra_vars
  188. executor = PlaybookExecutor(
  189. playbooks=[playbook_path], inventory=self.inventory, variable_manager=self.variable_manager,
  190. loader=self.loader,
  191. options=self.options, passwords=self.passwords,
  192. )
  193. executor._tqm._stdout_callback = self.callback
  194. constants.HOST_KEY_CHECKING = False # 关闭第一次使用ansible连接客户端是输入命令
  195. executor.run()
  196. except Exception as err:
  197. return False
  198.  
  199. def get_model_result(self):
  200. self.results_raw = {'success': {}, 'failed': {}, 'unreachable': {}}
  201. for host, result in self.callback.host_ok.items():
  202. hostvisiable = host.replace('.', '_')
  203. self.results_raw['success'][hostvisiable] = result._result
  204.  
  205. for host, result in self.callback.host_failed.items():
  206. hostvisiable = host.replace('.', '_')
  207. self.results_raw['failed'][hostvisiable] = result._result
  208.  
  209. for host, result in self.callback.host_unreachable.items():
  210. hostvisiable = host.replace('.', '_')
  211. self.results_raw['unreachable'][hostvisiable] = result._result
  212.  
  213. return self.results_raw
  214.  
  215. def get_playbook_result(self):
  216. self.results_raw = {'skipped': {}, 'failed': {}, 'ok': {}, "status": {}, 'unreachable': {}, "changed": {}}
  217. for host, result in self.callback.task_ok.items():
  218. self.results_raw['ok'][host] = result._result
  219.  
  220. for host, result in self.callback.task_failed.items():
  221. self.results_raw['failed'][host] = result._result
  222.  
  223. for host, result in self.callback.task_status.items():
  224. self.results_raw['status'][host] = result
  225.  
  226. for host, result in self.callback.task_skipped.items():
  227. self.results_raw['skipped'][host] = result._result
  228.  
  229. for host, result in self.callback.task_unreachable.items():
  230. self.results_raw['unreachable'][host] = result._result
  231. return self.results_raw
  1. if __name__ == '__main__':
    a="192.168.111.137,127.0.0.1"
    rbt = ANSRunner(a)
    # rbt.run_playbook(playbook_path='test.yml')
    # result = json.dumps(rbt.get_playbook_result(),indent=4)
    # rbt.run_model('shell','uptime')
    # rbt.run_model('shell','/app/tmp/startproxy.sh')
    # rbt.run_model('script','/app/fusionwork_scripts/os_script/add_host.sh')
    rbt.run_model('shell', 'cat /etc/hostname')
    # rbt.run_model('copy', 'src=/app/fusionwork_scripts/os_script/openresty.tgz dest=/home/mwopr/')
    result = json.dumps(rbt.get_model_result(),indent=4)
    print(result)
  1.  

Python中ansible的使用的更多相关文章

  1. Python调用ansible API系列(一)获取资产信息

    你想让ansible工作首先就需要设置资产信息,那么我们如何通过使用Python调取Ansible的API来获取资产信息呢? 要提前准备一个hosts文件 获取组或者主机 #!/usr/bin/env ...

  2. Python 中的 10 个常见安全漏洞,以及如何避免(上)

    简评:编写安全代码很困难,当你学习一个编程语言.模块或框架时,你会学习其使用方法. 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践.然而 ...

  3. Linux中ansible批量管理软件部署及剧本编写

    服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ...

  4. python中对 函数 闭包 的理解

    最近学到 函数 闭包的时候,似懂非懂.迷迷糊糊的样子,很是头疼,今天就特意查了下关于闭包的知识,现将我自己的理解分享如下! 一.python 闭包定义 首先,关于闭包,百度百科是这样解释的: 闭包是指 ...

  5. Python+Django+ansible playbook自动化运维项目实战☝☝☝

    Python+Django+ansible playbook自动化运维项目实战☝☝☝  一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...

  6. [转]Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

  7. python中的Ellipsis

    ...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...

  8. python中的默认参数

    https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...

  9. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

随机推荐

  1. Ethical Hacking - NETWORK PENETRATION TESTING(11)

    Securing your Network From the Above Attacks. Now that we know how to test the security of all known ...

  2. 【SpringBoot】 中时间类型 序列化、反序列化、格式处理

    [SpringBoot] 中时间类型 序列化.反序列化.格式处理 Date yml全局配置 spring: jackson: time-zone: GMT+8 date-format: yyyy-MM ...

  3. css : 使用浮动实现左右各放一个元素时很容易犯的错误

    比如说,有一个div,我想在左侧和右侧各方一个元素. 如果不想用flex,那就只能用浮动了. ... <div class="up clearfix"> <h6& ...

  4. vs code的使用(一) Format On Paste/Format On Save/ Format On Type

    很多经典的问题可以搜索出来,但是一些很小的问题网上却没有答案 (这是最令人发狂的,这么简单,网上居然连个相关的信息都没有给出) (就比如我想保存后自动格式化,但网上的大部分都是如何取消保存后自动格式化 ...

  5. vs coed的使用(二) 如何运行cpp文件(不用插件比如code runner)

    一.前提 1.配置好编译运行的环境,比如系统变量.vs code的settings.json 2.检查配置好的环境没有问题 我配置结果 [环境变量] [系统变量] 确定settings.json里面的 ...

  6. iframe和DataForm

    一.iframe使用 iframe在一个页面中,相当于整个window窗口的子窗口,可通过页面的元素结构查看. <div> <p>学习iframe</p> < ...

  7. setTimeout、clearTimeout、setInterval

    setTimeout(cb, ms) setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb).:setTimeout() 只执行一次指定函数. 返回一个代表定时器的 ...

  8. Laravel 定时任务调度 的 Artisan 命令调度

    1.创建命令 php artisan make:command command_name --command=artisan_command_name # Explanation: # command ...

  9. PHP get_defined_vars() 函数

    get_defined_vars() 函数返回由所有已定义变量所组成的数组. 版本要求:PHP 4 >= 4.0.4, PHP 5, PHP 7高佣联盟 www.cgewang.com 语法 a ...

  10. luogu P4516 [JSOI2018]潜入行动

    LINK:潜入行动 初看题感觉很不可做 但是树形dp的状态过于明显. 容易设\(f_{x,j,l,r}\)表示x为根子树内放了j个设备且子树内都被覆盖l表示x是否被覆盖r表示x是否放设备的方案数. 初 ...