目前,很多的工作都是批量的操作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之批量操作主机的更多相关文章

  1. 【实战小项目】python开发自动化运维工具--批量操作主机

    有很多开源自动化运维工具都很好用如ansible/salt stack等,完全不用重复造轮子.只不过,很多运维同学学习Python之后,苦于没小项目训练.本篇就演示用Python写一个批量操作主机的工 ...

  2. 简学Python第二章__巧学数据结构文件操作

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

  3. c++和python如何实现主机字节序和网络字节序的相互转换

    在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换.本篇文章着重介绍使用c++和python语言,如何实 ...

  4. 简说Python发展及其就业前景

    简说python 发展历史 Python是著名的"龟叔"Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. python从ABC语言 ...

  5. 简说Python之Jupyter Notebook

    目录 简说Python之Jupyter Notebook 1.Jupyter Notebook 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Py ...

  6. 【简说Python WEB】Flask-Moment

    目录 [简说Python WEB]Flask-Moment 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...

  7. 【简说Python WEB】视图函数操作数据库

    目录 [简说Python WEB]视图函数操作数据库 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 ...

  8. 【简说Python WEB】Flask应用的文件结构

    目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...

  9. 【简说Python WEB】数据库

    目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...

  10. 【简说Python WEB】Web应用部署

    目录 [简说Python WEB]Web应用部署 应用层 缓存层 数据层 Gunicorn 的应用 1.安装Gunicorn 2.Gunicorn的启动 Nginx 的应用 1.docker方式部署安 ...

随机推荐

  1. Oracle 几种行转列的方式 sum+decode sum+case when pivot

    原始数据: 方式一: select t_name, sum(decode(t_item, 'item1', t_num, 0)) item1, sum(decode(t_item, 'item2', ...

  2. zynq之TF卡写入常见问题

    zynq之TF卡写入常见问题 1.基本原理 前面做过zynq的TF读写实验,使用串口返回了实验所需的现象.那个时候也没有深究头文件"ff.h"里的几个常用的函数.这次需要使用TF卡 ...

  3. Android弹出UI界面---Toast

    1.默认展示 1 // 第一个参数:当前的上下文环境.可用getApplicationContext()或this 2 // 第二个参数:要显示的字符串.也可是R.string中字符串ID 3 // ...

  4. #Tarjan,树的直径#CF1000E We Need More Bosses

    题目 给定一个\(n\)个点\(m\)条边的无向图,找到两个点\(s,t\),使得\(s\)到\(t\)必须经过的边最多 分析 桥就是必须经过的边,考虑给无向图缩点, 按照桥建一棵树,那么就转换成了求 ...

  5. 记一次 .NET某管理局检测系统 内存暴涨分析

    一:背景 1. 讲故事 前些天有位朋友微信找到我,说他们的WPF程序有内存泄漏的情况,让我帮忙看下怎么回事?并且dump也抓到了,网上关于程序内存泄漏,内存暴涨的文章不计其数,看样子这个dump不是很 ...

  6. 数仓调优实战:GUC参数调优

    本文分享自华为云社区<GaussDB(DWS)性能调优系列实战篇七:十八般武艺之GUC参数调优>,作者: 黎明的风. 1. 前言 适用版本:[8.1.1及以上] GaussDB(DWS)性 ...

  7. Matplotlib绘图设置---坐标轴上下限/标题设置

    坐标轴上下限设置 plt.plot(x, np.sin(x)) #设置坐标轴上下限 plt.xlim(-1, 11) plt.ylim(-1.5, 1.5) plt.plot(x, np.sin(x) ...

  8. Elasticjob 3.x 最新版本源码解读(含备注源码)

    源码地址(含备注):https://gitee.com/ityml/elastic-job-zgc 官方网站: https://shardingsphere.apache.org/elasticjob ...

  9. pip提示升级pip版本

    今天在进行pip安装库的时候发现下面出现一段黄色的字体,如下图: 自由翻译: 大概意思就是说我现在安装的pip的版本是 20.0.2,最新版本是 20.1,希望我可以更新到最新的版本,并告诉了我怎么安 ...

  10. openGauss/MogDB零字节问题处理

    openGauss/MogDB 零字节问题处理 问题描述:java 应用端程序调用 GZIP 压缩类对数据进行编码压缩后入库 ,然后从数据库取出进行解压,原来再 mysql 数据库中是正常的,但迁移到 ...