目前,很多的工作都是批量的操作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. QT之数据显示

    引言 目前,为了提高数据校对的效率,使用合理的显示工具完成具体的数据处理,可以加速设计中调试的速度,这也是自行设计上位机的意义所在.数据处理在LabVIEW中是比较简单的,直接调用即可.在QT中可能需 ...

  2. [ROS串口通信]Serial库读入结构体

    本文介绍使用c++中Serial库读入结构体: //例如,结构体定义如下: typedef struct __attribute__((packed)) { uint16_t team; /* 本身队 ...

  3. how to install local jar to maven repository

    如何把maven不能引入的依赖安装到本地Repository: 1.比如fastdfs-client-java. <dependency> <groupId>org.csour ...

  4. 【已解决】Hadoop_03 解决Hadoop输入jps没有NameNode的问题

    问题描述: 解决方案: 1.先运行 stop-all.sh 2.格式化 namdenode(在这之前要先删除原目录,即core-site.xml下配置的<name>hadoop.tmp.d ...

  5. 【WCH以太网接口系列芯片】CH9121\20的使用和测试

    本篇文章将介绍沁恒微电子的以太网转接芯片CH9121(CH9120和CH9121使用上没有区别,注意配置工具不一样,可以在沁恒微电子官网自行下载测试),该芯片支持网口和串口相互透传,可以通过串口AT指 ...

  6. 22 axios和axios拦截器

    1. axios 由于jquery有严重的地狱回调逻辑. 再加上jquery的性能逐年跟不上市场节奏. 很多前端工程师采用axios来发送ajax. 相比jquery. axios更加灵活. 且容易使 ...

  7. #莫队二次离线,根号分治#洛谷 5398 [Ynoi2018] GOSICK

    题目 \(m\) 组询问求 \(\sum_{l\leq i,j\leq r}[a_i\bmod a_j==0],n,m,a_i\leq 5\times 10^5\) 分析 设 \(f(l,r,x)\) ...

  8. os.path.splitext

    os.path.splitext是Python标准库中的一个函数,它可以将一个文件路径拆分成两部分:文件名和文件扩展名.例如: 点击查看代码 import os file_path='avercrop ...

  9. 实验1 c语言开发环境使用和数据类型 运算符 表达式

    #include<stdio.h> #include<stdlib.h> int main() { printf(" O\n"); printf(" ...

  10. cookie与localStorage与sessionStorage

    1. cookie 1_1: 简述 HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送(由服务器设置后返回给浏览器端)到用户浏览器并保存在本地的一小块数据.浏览器 ...