Python中ansible的使用
#!/usr/bin/env python
# -*- coding: utf8 -*-
# @Author: huangmanyao
from ansible import constants
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
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 ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager
import json
import IPy class ModelResultsCollector(CallbackBase):
''' 重构执行结果 '''
def __init__(self, *args, **kwargs):
super(ModelResultsCollector, self).__init__(*args, **kwargs)
self.host_ok = {}
self.host_unreachable = {}
self.host_failed = {} def v2_runner_on_unreachable(self, result):
''' 不可达 '''
self.host_unreachable[result._host.get_name()] = result def v2_runner_on_ok(self, result, *args, **kwargs):
''' 执行成功 '''
self.host_ok[result._host.get_name()] = result def v2_runner_on_failed(self, result, *args, **kwargs):
''' 执行失败 '''
self.host_failed[result._host.get_name()] = result class PlayBookResultsCollector(CallbackBase):
CALLBACK_VERSION = 2.0 def __init__(self, *args, **kwargs):
super(PlayBookResultsCollector, self).__init__(*args, **kwargs)
self.task_ok = {}
self.task_skipped = {}
self.task_failed = {}
self.task_status = {}
self.task_unreachable = {} def v2_runner_on_ok(self, result, *args, **kwargs):
self.task_ok[result._host.get_name()] = result def v2_runner_on_failed(self, result, *args, **kwargs):
self.task_failed[result._host.get_name()] = result def v2_runner_on_unreachable(self, result):
self.task_unreachable[result._host.get_name()] = result def v2_runner_on_skipped(self, result):
self.task_ok[result._host.get_name()] = result def v2_playbook_on_stats(self, stats):
hosts = sorted(stats.processed.keys())
for h in hosts:
t = stats.summarize(h)
self.task_status[h] = {
"ok": t['ok'],
"changed": t['changed'],
"unreachable": t['unreachable'],
"skipped": t['skipped'],
"failed": t['failures']
} class ANSRunner(object):
"""
This is a General object for parallel execute modules.
""" def __init__(self, ips=None, *args, **kwargs):
self.ips = ips
self.inventory = None
self.variable_manager = None
self.loader = None
self.options = None
self.passwords = None
self.callback = None
self.__initializeData()
self.results_raw = {} def is_ip(self,address):
try:
IPy.IP(address)
return True
except Exception as e:
return False def list_to_str(self,ips):
ipsstr = ','.join(ips)
if len(ips) == 1:
ipsstr += ','
return ipsstr def list_ip_check(self,ips):
ipslist = ips
ipslist_len = len(ips)
if ipslist_len > 1:
for ip in ipslist:
if not self.is_ip(ip):
ipslist.remove(ip)
return ipslist def ips_cov_str(self):
if not self.ips:
self.ips = "127.0.0.1" if isinstance(self.ips,list):
self.ips = self.list_ip_check(self.ips)
self.ips = self.list_to_str(self.ips) elif isinstance(self.ips,str):
ipslist = self.ips.split(',')
ipslist = self.list_ip_check(ipslist)
self.ips = self.list_to_str(ipslist) def __initializeData(self):
""" 初始化ansible """
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'timeout', 'remote_user',
'ask_pass', 'private_key_file', 'ssh_common_args', 'ssh_extra_args',
'sftp_extra_args',
'scp_extra_args', 'become', 'become_method', 'become_user', 'ask_value_pass',
'verbosity',
'check', 'listhosts', 'listtasks', 'listtags', 'syntax', 'diff']) self.options = Options(connection='smart', module_path=None, forks=100, timeout=10,
remote_user='root', ask_pass=False, private_key_file=None, ssh_common_args=None,
ssh_extra_args=None,
sftp_extra_args=None, scp_extra_args=None, become=None, become_method=None,
become_user='root', ask_value_pass=False, verbosity=None, check=False, listhosts=False,
listtasks=False, listtags=False, syntax=False, diff=True) self.loader = DataLoader()
self.ips_cov_str()
self.inventory = InventoryManager(loader=self.loader, sources='%s'%(self.ips))
self.variable_manager = VariableManager(loader=self.loader, inventory=self.inventory) def run_model(self, module_name, module_args):
"""
run module from andible ad-hoc.
module_name: ansible module_name
module_args: ansible module args
"""
self.ips_cov_str() play_source = dict(
name="Ansible Play",
hosts=self.ips,
gather_facts='no',
tasks=[dict(action=dict(module=module_name, args=module_args))]
) play = Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader)
tqm = None
self.callback = ModelResultsCollector()
import traceback
try:
tqm = TaskQueueManager(
inventory=self.inventory,
variable_manager=self.variable_manager,
loader=self.loader,
options=self.options,
passwords=self.passwords,
stdout_callback="minimal",
)
tqm._stdout_callback = self.callback
constants.HOST_KEY_CHECKING = False # 关闭第一次使用ansible连接客户端是输入命令
tqm.run(play)
except Exception as err:
print(traceback.print_exc())
finally:
if tqm is not None:
tqm.cleanup() def run_playbook(self, playbook_path, extra_vars=None):
"""
运行playbook
"""
try:
self.callback = PlayBookResultsCollector()
if extra_vars:
self.variable_manager.extra_vars = extra_vars
executor = PlaybookExecutor(
playbooks=[playbook_path], inventory=self.inventory, variable_manager=self.variable_manager,
loader=self.loader,
options=self.options, passwords=self.passwords,
)
executor._tqm._stdout_callback = self.callback
constants.HOST_KEY_CHECKING = False # 关闭第一次使用ansible连接客户端是输入命令
executor.run()
except Exception as err:
return False def get_model_result(self):
self.results_raw = {'success': {}, 'failed': {}, 'unreachable': {}}
for host, result in self.callback.host_ok.items():
hostvisiable = host.replace('.', '_')
self.results_raw['success'][hostvisiable] = result._result for host, result in self.callback.host_failed.items():
hostvisiable = host.replace('.', '_')
self.results_raw['failed'][hostvisiable] = result._result for host, result in self.callback.host_unreachable.items():
hostvisiable = host.replace('.', '_')
self.results_raw['unreachable'][hostvisiable] = result._result return self.results_raw def get_playbook_result(self):
self.results_raw = {'skipped': {}, 'failed': {}, 'ok': {}, "status": {}, 'unreachable': {}, "changed": {}}
for host, result in self.callback.task_ok.items():
self.results_raw['ok'][host] = result._result for host, result in self.callback.task_failed.items():
self.results_raw['failed'][host] = result._result for host, result in self.callback.task_status.items():
self.results_raw['status'][host] = result for host, result in self.callback.task_skipped.items():
self.results_raw['skipped'][host] = result._result for host, result in self.callback.task_unreachable.items():
self.results_raw['unreachable'][host] = result._result
return self.results_raw
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)
Python中ansible的使用的更多相关文章
- Python调用ansible API系列(一)获取资产信息
你想让ansible工作首先就需要设置资产信息,那么我们如何通过使用Python调取Ansible的API来获取资产信息呢? 要提前准备一个hosts文件 获取组或者主机 #!/usr/bin/env ...
- Python 中的 10 个常见安全漏洞,以及如何避免(上)
简评:编写安全代码很困难,当你学习一个编程语言.模块或框架时,你会学习其使用方法. 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践.然而 ...
- Linux中ansible批量管理软件部署及剧本编写
服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ...
- python中对 函数 闭包 的理解
最近学到 函数 闭包的时候,似懂非懂.迷迷糊糊的样子,很是头疼,今天就特意查了下关于闭包的知识,现将我自己的理解分享如下! 一.python 闭包定义 首先,关于闭包,百度百科是这样解释的: 闭包是指 ...
- Python+Django+ansible playbook自动化运维项目实战☝☝☝
Python+Django+ansible playbook自动化运维项目实战☝☝☝ 一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...
- [转]Python中的str与unicode处理方法
早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...
- python中的Ellipsis
...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...
- python中的默认参数
https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
随机推荐
- Web Scraping using Python Scrapy_BS4 - Software
Install the following software before web scraping. Visual Studio Code Python and Pip pip install vi ...
- python怎么自学?今日头条技术大佬的真实经历分享
大家好,我是武州,27岁,目前在字节跳动担任Python后端工程师一职. (摆拍一下,假装是保安) 在开始今天的文章之前,不知道你们有没有遇到过这样的问题: 大学没学到什么实质技术,毕业后找不到高薪的 ...
- 【思维+大数(高精度)】number 计蒜客 - 45276
题目: 求 1 到 10^n 的数字中有 3 的数字的数量. 输入格式 1 个整数 n. 输出格式 共一行,1 个整数,表示答案. 数据范围 对于 10% 的数据,n≤8 对于 30% 的数据,n≤1 ...
- Dart函数
函数 Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function.这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征.同时意味着在Dart语言 ...
- 性能测试 -- docker安装influxdb
一.前提 1.项目已经部署好 2.docker已经安装好 二.docker安装influxdb 1.下载influxdb镜像:docker pull tutum/influxdb 1)超时报错: ...
- Java方法(函数)
4.1方法简介 方法是语句的集合,他们在一起执行一个功能: 1.方法是解决一类问题的步骤的有序组合(功能块) 2.方法包含于类与对象中 3.方法在程序中创建,在其它地方引用 4.原子性:单一职能原则( ...
- Markdown显示测试
这是一个一级标题 文本1 文本2 这是一个二级标题 斜体 粗体 粗斜体 下面是分割线 上面是分割线 删除线 下划线 脚注[1] 这是一个三级标题 无序列表1 内容 无序列表2 内容 无序列表3 有序列 ...
- Day05_企业权限管理(SSM整合)
学于黑马程序员和传智播客联合做的教学项目 感谢 黑马程序员官网 传智播客官网 个人根据教程的每天的工作进度的代码和资料 密码:cti5 b站在线视频 微信搜索"艺术行者",关注并回 ...
- FPGA内部IP核DDS
项目当中需要正弦信号与余弦信号,首先想到了DDS芯片,例如AD9833.AD9834.由于还需要用FPGA 做一些数据处理,后来干脆直接用FPGA 内部的DDSIP核,同时根据IP核内部的相位累加 ...
- Python os.statvfs() 方法
概述 os.statvfs() 方法用于返回包含文件描述符fd的文件的文件系统的信息.高佣联盟 www.cgewang.com 语法 statvfs()方法语法格式如下: os.statvfs([pa ...