[ Python - 10 ] 练习:批量管理主机工具
需求:
- 主机分组
- 登录后显示主机分组,选择分组后查看主机列表
- 可批量执行命令、发送文件,结果实时返回
- 主机用户名密码可以不同
流程图:
说明:
## 需求:
- 主机分组
- 登录后显示主机分组,选择分组后查看主机列表
- 可批量执行命令、发送文件,结果实时返回
- 主机用户名密码可以不同
## 目录结构
batch-manage
bin/
start.py # 启动主程序
conf/
setting.py # 远程主机配置文件
core/
control.py # RemoteControl类,用于远程主机执行命令及上传
local.py # 本地数据处理 ## 说明
目前实现可批量执行命令,上传文件功能。 ## 运行环境
windows
python3.0+ 代码下载地址:https://github.com/hukeyy/batch-manage
bin/
start.py
#!_*_coding:utf-8_*_
# Author: hkey
import threading, os, sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
from core import control
from core import local
from conf import setting if __name__ == '__main__': for host in setting.hosts.keys():
host_tuple = local.options()
print('\33[42;1m[put file or inter system command.]\33[0m')
while True:
cmd = input('>>>').strip()
if len(cmd) == 0: continue
t_list = []
for host in host_tuple:
remote_control = control.RemoteControl(cmd, *host)
t = threading.Thread(target=remote_control.run,)
t.setDaemon(True)
t.start()
t_list.append(t)
for t in t_list:
t.join()
conf/
setting.py
#!_*_coding:utf-8_*_
# Author: hkey
## 元组在python中是不可变对象,保存序列时,应当尽量采用这种方式
hosts = {'测试系统':(('10.0.0.11', 22, 'root', ''),
('10.0.0.12', 22, 'root', ''),
), '生产系统':(('10.0.0.12', 22, 'root', ''),
),
}
core/
control.py
#!_*_coding:utf-8_*_
# Author: hkey
import paramiko class RemoteControl(object):
'''远程主机操作类'''
def __init__(self, cmd, *kw):
self.hostname = kw[0]
self.port = kw[1]
self.username = kw[2]
self.password = kw[3]
self.cmd = cmd def run(self):
'''通过反射功能将程序解耦'''
cmd = self.cmd.split()[0]
if hasattr(self, cmd):
getattr(self, cmd)()
else:
setattr(self, cmd, self.command)
getattr(self, cmd)() def put(self):
'''上传文件'''
# try:
transport = paramiko.Transport(self.hostname, self.port)
transport.connect(username=self.username, password=self.password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(self.cmd.split()[1], self.cmd.split()[2])
transport.close()
print('\33[32;1m【%s】上传文件【%s】成功!' %(self.hostname, self.cmd.split()[1]))
# except Exception as e:
# print('\33[31;1m错误:【%s】: 【%s】\33[0m' %(self.hostname, e)) def command(self):
'''执行系统静态命令'''
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=self.hostname, port=self.port, username=self.username,
password=self.password)
stdin, stdout, stderr = ssh.exec_command(self.cmd)
res, err = stdout.read(), stderr.read()
result = res if res else err
print('\33[32;1m%s\33[0m'.center(50, '-') % self.hostname)
print(result.decode())
ssh.close()
core/
local.py
#!_*_coding:utf-8_*_
# Author: hkey
import os, sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
from conf import setting
def options():
'''通过配置文件setting.py,用户选择主机组并通过用户选择的组获取到主机的信息'''
for host in setting.hosts.keys():
print(host)
while True:
choice = input('please choice groupname:')
if len(choice) ==0: continue
if choice in setting.hosts.keys():
for host in setting.hosts[choice]:
print(host[0])
return setting.hosts[choice]
else:
print('groupname not exist.')
break
[ Python - 10 ] 练习:批量管理主机工具的更多相关文章
- 【Python】JBOSS-JMX-EJB-InvokerServlet批量检测工具
一.说明 在JBoss服务器上部署web应用程序,有很多不同的方式,诸如:JMX Console.Remote Method Invocation(RMI).JMXInvokerServlet.Htt ...
- Python简单主机批量管理工具
一.程序介绍 需求: 简单主机批量管理工具 需求: 1.主机分组 2.主机信息使用配置文件 3.可批量执行命令.发送文件,结果实时返回 4.主机用户名密码.端口可以不同 5.执行远程命令使用param ...
- python 简单主机批量管理工具
需求: 主机分组 主机信息配置文件用configparser解析 可批量执行命令.发送文件,结果实时返回,执行格式如下 batch_run -h h1,h2,h3 -g web_cluster ...
- 【Python之旅】第六篇(七):开发简易主机批量管理工具
[Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...
- python运维之使用python进行批量管理主机
1. python运维之paramiko 2. FABRIC 一个与多台服务器远程交互的PYTHON库和工具 3. SSH连接与自动化部署工具paramiko与Fabric 4. Python批量管理 ...
- Python开发程序:简单主机批量管理工具
题目:简单主机批量管理工具 需求: 主机分组 登录后显示主机分组,选择分组后查看主机列表 可批量执行命令.发送文件,结果实时返回 主机用户名密码可以不同 流程图: 说明: ### 作者介绍: * au ...
- MySQL通用批量写入工具(Python)
背景 平台目前的分析任务主要以Hive为主,分析后的结果存储在HDFS,用户通过REST API或者Rsync的方式获取分析结果,这样的方式带来以下几个问题: (1)任务执行结束时间未知,用户 ...
- Linux系统——Ansible批量管理工具
批量管理工具: (1)ansible 操作简单(适用于500台以下服务器) (2)saltstack 比较复杂(一般适用于1000-4w台服务器) (3)puppet超级复杂 systemctl(统一 ...
- 简单主机批量管理工具(这里实现了paramiko 用su切换到root用户)
项目名:简单主机批量管理工具 一.需求 1.主机分组 2.可批量执行命令.发送文件,结果实时返回,执行格式如下 batch_run -h h1,h2,h3 -g web_clusters,db_ ...
随机推荐
- Vue折腾记 - (2)写一个不大靠谱的面包屑组件
先看效果图 我把页面标题和面包屑封装到一起..就不用涉及到组件的通讯了,不然又要去监听路由或者依赖状态去获取 这里写图片描述 疑惑解答: 点击父(也就是折叠菜单)为什么会跑到子菜单第一个 因为我第一个 ...
- BZOJ 2669 CQOI2012 局部极小值 状压dp+容斥原理
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题意概述:实际上原题意很简洁了我就不写了吧.... 二话不说先观察一下性质,首先棋盘 ...
- UVA 11882 Biggest Number(搜索+剪枝)
You have a maze with obstacles and non-zero digits in it: You can start from any square, walk in the ...
- 最短路径——Bellman-Ford算法
一.相关定义 最短路径:求源点到某特定点的最短距离 特点:Bellman-Ford算法主要是针对有负权值的图,来判断该图中是否有负权回路或者存在最短路径的点 局限性:算法效率不高,不如SPFA算法 时 ...
- matlab mex 小o -o 出错
https://github.com/kyamagu/mexopencv/issues/117 就是说2014a以后的版本mex -o 选项变成了 -output 蛋疼,这有什么好改的.找了好久才 ...
- 转 Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5
Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5 Posted February 18, 2011 at 6:29 PM ...
- MySQL 初识01
最近开始学习MySQL 所以将这两天所学习到的知识简单小结一下 1.status 显示数据库信息 2.数据类型: a.字符串: char(m):固定长度的字符,最多255个字符: varchar(m) ...
- 获取JavaScript对象的方法
写定义一个对象,如var a = new Array(),debugger,然后执行F12控制台的开发者模式下,进入断点,断点里面 会显示所有的方法的. var a = new Array(); de ...
- 关于socket的疑问
一直感觉一端发送数据,另一端接受数据很不可思议的事情,如果不能即时地读走会导致什么后果呢? 其实socket读出来的数据,你自己看着办,里面的数据是什么格式你自己去解析,用户可以基于TCP去实现你自己 ...
- P3509 [POI2010]ZAB-Frog
题目描述 On the bed of one particularly long and straight Byteotian brook there lie rocks jutting above ...