简说python之批量操作主机
目前,很多的工作都是批量的操作Linux主机。通过python脚本,封装Linux的shell命令。保证批量操作,简易优化工作。
Python批量操作主机
安装paramiko模块
ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。
由于paramiko属于第三方库,安装方式如下:
G:\Py>pip install paramiko
远程ssh控制主机
import paramiko
from concurrent.futures import ThreadPoolExecutor
class SSHParamiko(object):
err = "argument passwd or rsafile can not be None"
def __init__(self, host, port, user, passwd=None, rsafile=None):
self.h = host
self.p = port
self.u = user
self.w = passwd
self.rsa = rsafile
def _connect(self):
if self.w:
return self.pwd_connect()
elif self.rsa:
return self.rsa_connect()
else:
raise ConnectionError(self.err)
def pwd_connect(self):
conn = paramiko.SSHClient()
conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
conn.connect(self.h, self.p, self.u, self.w)
return conn
def rsa_connect(self):
pkey = paramiko.RSAKey.from_private_key_file(self.rsa)
conn = paramiko.SSHClient()
conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
conn.connect(hostname=self.h, port=self.p, username=self.u, pkey=pkey)
return conn
def run_cmd(self, cmd):
conn = self._connect()
stdin, stdout, stderr = conn.exec_command(cmd)
code = stdout.channel.recv_exit_status()
stdout, stderr = stdout.read(), stderr.read()
conn.close()
if not stderr:
return code, stdout.decode()
else:
return code, stderr.decode()
class AllRun(object):
def __init__(self, ssh_objs, cmds, max_worker=50):
self.objs = [o for o in ssh_objs]
self.cmds = [c for c in cmds]
self.max_worker = max_worker # 最大并发线程数
self.success_hosts = [] # 存放成功机器数目
self.failed_hosts = [] # 存放失败的机器IP
self.mode = None
self.func = None
def serial_exec(self, obj):
"""单台机器上串行执行命令,并返回结果至字典"""
result = list()
for c in self.cmds:
r = obj.run_cmd(c)
result.append([c, r])
return obj, result
def concurrent_run(self):
"""并发执行"""
future = ThreadPoolExecutor(self.max_worker)
for obj in self.objs:
try:
future.submit(self.serial_exec, obj).add_done_callback(self.callback)
except Exception as err:
print(err)
future.shutdown(wait=True)
def callback(self, future_obj):
"""回调函数,处理返回结果"""
ssh_obj, rlist = future_obj.result()
print("{} execute detail:".format(ssh_obj.h))
is_success = True
for item in rlist:
cmd, [code, res] = item
info = f"{cmd} | code => {code}\nResult:\n{res}"
print(info)
if is_success:
self.success_hosts.append(ssh_obj.h)
if ssh_obj.h in self.failed_hosts:
self.failed_hosts.remove(ssh_obj.h)
def overview(self):
"""展示总的执行结果"""
for i in self.success_hosts:
print(i)
print("-" * 30)
for j in self.failed_hosts:
print(j)
info = "Success hosts {}; Failed hosts {}."
s, f = len(self.success_hosts), len(self.failed_hosts)
info = info.format(s, f)
print(info)
if __name__ == '__main__':
# 测试环境
ip_204 = SSHParamiko("172.17.xx.204", 22, "root", "xx")
ip_200 = SSHParamiko("172.17.xx.200", 22, "root", "xx")
ip_202 = SSHParamiko("172.17.xx.202", 22, "root", "xx")
# 种子环境
ip_200_30 = SSHParamiko("172.30.xx.30", 9900, "root", "xx")
cmds =["df -h"]
# all_ip = AllRun([ip_204, ip_200,ip_202], cmds)
seed_ip = AllRun([ip_200_30], cmds)
seed_ip.concurrent_run()
seed_ip.overview()
print("--------------------------------------------------------------")
res = ip_200_30.run_cmd("df -h")
print(res[0])
print(res[1])
另存为batch01.py
,执行结果如下:
G:\Py>python batch01.py
172.30.200.30 execute detail:
df -h | code => 0
Result:
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 30G 3.4G 25G 13% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sda1 190M 52M 129M 29% /boot
/dev/sdb1 197G 20G 168G 11% /opt
172.30.200.30
------------------------------
Success hosts 1; Failed hosts 0.
--------------------------------------------------------------
0
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 30G 3.4G 25G 13% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sda1 190M 52M 129M 29% /boot
/dev/sdb1 197G 20G 168G 11% /opt
简说python之批量操作主机的更多相关文章
- 【实战小项目】python开发自动化运维工具--批量操作主机
有很多开源自动化运维工具都很好用如ansible/salt stack等,完全不用重复造轮子.只不过,很多运维同学学习Python之后,苦于没小项目训练.本篇就演示用Python写一个批量操作主机的工 ...
- 简学Python第二章__巧学数据结构文件操作
#cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...
- c++和python如何实现主机字节序和网络字节序的相互转换
在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换.本篇文章着重介绍使用c++和python语言,如何实 ...
- 简说Python发展及其就业前景
简说python 发展历史 Python是著名的"龟叔"Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. python从ABC语言 ...
- 简说Python之Jupyter Notebook
目录 简说Python之Jupyter Notebook 1.Jupyter Notebook 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Py ...
- 【简说Python WEB】Flask-Moment
目录 [简说Python WEB]Flask-Moment 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...
- 【简说Python WEB】视图函数操作数据库
目录 [简说Python WEB]视图函数操作数据库 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 ...
- 【简说Python WEB】Flask应用的文件结构
目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...
- 【简说Python WEB】数据库
目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...
- 【简说Python WEB】Web应用部署
目录 [简说Python WEB]Web应用部署 应用层 缓存层 数据层 Gunicorn 的应用 1.安装Gunicorn 2.Gunicorn的启动 Nginx 的应用 1.docker方式部署安 ...
随机推荐
- Python爬虫爬取ECVA论文标题、作者、链接
1 import re 2 import requests 3 from bs4 import BeautifulSoup 4 import lxml 5 import traceback 6 imp ...
- 强烈推荐:2024 年12款 Visual Studio 亲测、好用、优秀的工具,AI插件等
工具类扩展 1. ILSpy 2022 (免费) ILSpy 是 ILSpy 开源反编译器的 Visual Studio 扩展. 是一款开源.免费的.且适用于.NET平台反编译[C#语言编写的程序和库 ...
- Tomcat内存马分析
前言 自己简单搭建一个Tomcat项目,IDEA里选择JavaEE,勾上web就行了 加个依赖(这样就能找到三个Context了: <dependency> <groupId> ...
- requests进阶
requests进阶 三.requests模块处理cookie相关的请求 1 爬虫中使用cookie 为了能够通过爬虫获取到登录后的页面,或者是解决通过cookie的反扒,需要使用request来处理 ...
- 构筑智能未来的开源 .Net AI知识库/智能体项目
在这个信息爆炸的时代,我们如何快速准确地从汪洋大海的数据中抽取真正有价值的知识呢?AntSK,一个基于.NET开发的人工智能知识库和智能体项目,似乎给出了一个新颖的答案.今天,就让我们一起深入了解An ...
- C#_面试题1
C#_面试题1 1.维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么? 答:尽可能用约束(包括CHECK.主键.唯一键.外键.非空字段)实现,这种方式的效率最好:其次用触发器,这种方 ...
- 一个很好用的ORM库--peewee
发现一个很好用的 ORM 库 -- peewee 以下为简单示例 from peewee import * db = SqliteDatabase('test.db') # 定义表结构 class P ...
- caidao qsnctfwp
进入网页发现如下内容 直接使用蚁剑连接 连接并进入后,在根目录下发现名为 flag 的文件,即可获取 flag -End-
- PyQt 快速使用
1.安装 PyQt:使用 pip 命令在终端或命令提示符中运行以下命令: pip install pyqt5 2.创建 PyQt 应用程序:导入 PyQt5 模块并创建一个 QApplication ...
- JavaIDEA配置JDBC数据库连接+可视化页面
"感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 0X01 ...