python第五十二天---第九周作业 类 Fabric 主机管理程序
类 Fabric 主机管理程序开发:
1. 运行程序列出主机组或者主机列表
2. 选择指定主机或主机组
3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)
4. 充分使用多线程或多进程
5. 不同主机的用户名密码、端口可以不同
README
类 Fabric 主机管理程序
执行命令(SSH)
向其传输文件(上传/下载) Fabric/#程序目录
|- - -__init__.py
|- - -bin/#启动目录
| |- - -__init__.py
| |- - -Fabric_start.py#视图启动
| |- - -user_reg.py#主机添加启动
|
|- - -cfg/#配置目录
| |- - -__init__.py
| |- - -config.py#配置文件
|
|- - -core/#下载文件目录
| |- - -__init__.py
| |- - -main.py#主要逻辑 类
|
|- - -db/#主机列表文件目录
| |- - -
|
|- - -get_file/#下载文件目录
|
|
|- - -put_file/#上传文件目录
|- - -REDMAE
Fabric/#程序目录
|- - -__init__.py
|- - -bin/#启动目录
| |- - -__init__.py
| |- - -Fabric_start.py#视图启动
import configparser
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
from core.main import loging
if __name__ == '__main__': loging()
| |- - -user_reg.py#主机添加启动
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan import configparser
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
from cfg import config
#修改个信息 磁盘大小
def set_info(gr_name,addse,name,pwd,ports):
config_info=configparser.ConfigParser()#读数据
file_dir='%s%s'%(config.AUTH_FILE,gr_name)#主机组用户名密码文件路径 config_info[addse]={}#ip 主机
config_info.set(addse,config.USER,name)#用户
config_info.set(addse,config.PWD,pwd)#密码
config_info.set(addse,config.PORTS,ports)#端口
with open(file_dir,'a') as f:
config_info.write(f)#写入文件
#config_info.write(open(file_dir,'a'))#写入文件
print('创建完成'.center(60,'='))
print('组:【%s】\nIP:[%s]\n用户名:[%s]\n密码:[%s]\n端口:[%s]'%(gr_name,addse,name,pwd,ports)) if __name__ == '__main__':
gr_name=input('组名:')#组
addse=input('IP地址:')#ip地址
name=input('用户名:')#用户
pwd=input('密码:')#密码
ports=input('端口:')#端口 set_info(gr_name,addse,name,pwd,ports)
|- - -cfg/#配置目录
| |- - -__init__.py
|- - -config.py#配置文件
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan import configparser
import os ,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量 AUTH_FILE='%s/db/'%BASE_DIR#主机组 信息用户名密码文件路径
FILE_DIR='%s/put_file'%BASE_DIR#要上传文件所在的目录
GET_FILE_DIR='%s/get_file'%BASE_DIR#要上传文件所在的目录
#print(AUTH_FILE)
PWD='pwd'#密码
USER='user'
PORTS='ports'
INST_LIST=['put','get']#指令列表 PUT='put'
GET='get'
|- - -core/#下载文件目录
| |- - -__init__.py
| |- - -main.py#主要逻辑 类
#!usr/bin/env python
#-*-coding:utf-8-*-
# Author calmyan import configparser
import os ,sys
import threading,time
import paramiko,queue
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
sys.path.append(BASE_DIR)#增加环境变量
from cfg import config class Fabric_gr(object):
def __init__(self,gr_name):#组名
self.gr_name='%s%s'%(config.AUTH_FILE,gr_name)#主机组用户名密码文件路径
self.config_info=configparser.ConfigParser()#读数据对象
self.name_l=[]#定义一个列表
self.attr=[]
self.file_dir=''#上传文件路径
self.get_file=''#下载传文件路径 def group_open(self):#打开组文件
self.config_info.read(self.gr_name)#读取文件
for i in range(len(self.config_info.sections())):
self.name_l.append(self.config_info.sections()[i])#信息添加到列表
else:
print('主机列表:'.center(40,'='))
for i in self.name_l:
print(('[%s]'%i).center(40,' ')) def inst_attr(self,inst):#获取指令
self.instruction=inst
self.attr=self.instruction.split()
self.inst_a=self.attr[0] def inst(self):#指令判断
if self.inst_a in config.INST_LIST:
return True
else:
return False def open_list(self):#创建 线程 方法
if self.inst_a==config.PUT:
if self.File_Dir():#查找本地文件
pass
else:
return
self.re_lilst=[]#定义一个列表
for j in range(len(self.name_l)):
sttr=self.config_info.sections()[j]#获取到对象
user_dict={}#创建一个空字典
for i,v in self.config_info[sttr].items():#可以循环输出 获ip 用户 密码 端口
user_dict[i]=v
sttr=threading.Thread(target=self.thr_run,args=(sttr,user_dict[config.USER],user_dict[config.PWD],int(user_dict[config.PORTS])))#创建新线程
sttr.start()#启动线程
self.re_lilst.append(sttr)#不用JOIN,避免阻塞为串行
else:
for i in self.re_lilst:#等待线程 完成
i.join() def open_list2(self):#创建 线程 方法
self.re_lilst=[]#定义一个列表
for j in range(len(self.name_l)):
sttr=self.config_info.sections()[j]#获取到对象
user_dict={}#创建一个空字典
for i,v in self.config_info[sttr].items():#可以循环输出 获ip 用户 密码 端口
user_dict[i]=v
sttr=threading.Thread(target=self.ssh_run,args=(sttr,user_dict[config.USER],user_dict[config.PWD],int(user_dict[config.PORTS])))#创建新线程
sttr.start()#启动线程
self.re_lilst.append(sttr)#不用JOIN,避免阻塞为串行
else:
for i in self.re_lilst:#等待线程 完成
i.join() def thr_run(self,addrs,user,paswd,ports):#传输通道
try:
transport=paramiko.Transport((addrs,ports))#传输模块 Transport 服务器地址 端口
transport.connect(username=user,password=paswd)#用户名,,密码
sftp=paramiko.SFTPClient.from_transport(transport)#调用传输方法
print('[%s]连接成功!'%addrs)
self.file_dir='%s/%s'%(config.FILE_DIR,self.attr[1])#上传文件路径
if self.inst_a==config.PUT:
sftp.put(self.file_dir,self.attr[2])#上传文件 ,本地路径文件 ,服务器的路径文件
print('【%s】文件上传完成!'%addrs)
elif self.inst_a==config.GET:
self.get_file='%s/%s_%s'%(config.GET_FILE_DIR,addrs,self.attr[2])#下载文件路径
print(self.get_file)
sftp.get(self.attr[1],self.get_file)#下载文件 ,服务器的路径文件 ,本地路径文件
print('【%s】文件下载完成!'%addrs)
else:
print('【%s】文件相关操作失败!'%addrs)
pass
except Exception as e:
print(e) def File_Dir(self):#判断文件是否存在
file=self.attr[1] print(file)
self.file_dir='%s/%s'%(config.FILE_DIR,file)#文件路径
if os.path.isfile(self.file_dir):
print('成功找到文件!')
return True
else:
print('文件不存在!')
return False
def ssh_run(self,addrs,user,paswd,ports):#ssh
ssh =paramiko.SSHClient()#创建一个SSH连接对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#允许连接不在KNOV_HOSTs文件中的主机 自动添加
try:
ssh.connect(hostname=addrs,port=ports,username=user,password=paswd)#连接,主机 端口 用户名 密码
print('[%s]连接成功!'%addrs)
except Exception as e:
print(e)
return
stdin,stdout,stderr=ssh.exec_command(self.instruction)#.exec_command 为执行命令,返回结果 ,标准输入,标准输出,标准错误,错误与输出只会返回其一
result=stdout.read()#获取结果
try:
if len(result)<1:#如果为空 返回错误信息
result=stderr.read()
print(addrs.center(60,'='))
print(result.decode())
else:
print(addrs.center(60,'='))
print(result.decode())
except Exception as e:
print(e) info_l='''--------指令帮助--------
上传文件: put file /home/tmp/file (指令 本地文件 服务端位置文件)
下载文件: get /home/tmp/file file (指令 服务端位置文件 本地文件)
其他指令: ssh相关命令 如 df pwd ifconfig ls等
查看帮助: helps
返回上层: quit
退出程序: exit
''' def loging():
print(info_l)
while True:
s=os.listdir(config.AUTH_FILE)
print('主机组'.center(60,'='))
for i,v in enumerate(s):
print('编号:%s 组名:%s'%(i,v))
gr_name=input('选择组:')
if gr_name=='exit':
exit()
if gr_name=='helps':
print(info_l)
continue
try:
gr_file=s[int(gr_name)] lst=Fabric_gr(gr_file)#实例连接
lst.group_open()#打开
while True:
#print(info_l)
inst=input('指令>>>:')
if inst=='exit':
exit()
if inst=='quit':
continue
if inst=='helps':
print(info_l)
continue
lst.inst_attr(inst)#获取指令
if lst.inst():#指令判断
lst.open_list()#开启线程创建
else:
lst.open_list2()
pass
except ValueError as e:
print(e)
python第五十二天---第九周作业 类 Fabric 主机管理程序的更多相关文章
- python作业类Fabric主机管理程序开发(第九周)
作业需求: 1. 运行程序列出主机组或者主机列表 2. 选择指定主机或主机组 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) 4. 充分使用多线程或多进程 5. 不同主机的用户名密码 ...
- python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)
类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...
- python 学习分享-实战篇类 Fabric 主机管理程序开发
# 类 Fabric 主机管理程序开发: # 1. 运行程序列出主机组或者主机列表 # 2. 选择指定主机或主机组 # 3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载) # 4. 充分 ...
- 类 Fabric 主机管理程序开发
类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主 ...
- paramiko类Fabric主机管理
环境:Linux python3.5 要求:类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/ ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2017-2018-1 20179205《Linux内核原理与设计》第九周作业
<Linux内核原理与设计>第九周作业 视频学习及代码分析 一.进程调度时机与进程的切换 不同类型的进程有不同的调度需求,第一种分类:I/O-bound 会频繁的进程I/O,通常会花费很多 ...
- 孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录
孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...
- 2019-2020-1 20199325《Linux内核原理与分析》第九周作业
第九周作业要求: 理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否准确: 使用gdb跟踪分析一个sc ...
随机推荐
- linux中crontab的使用方法
crontab参数说明: -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv V ...
- 关于JS的一些东西
1.声明Js代码域 1.在head标签中使用script声明js代码域 <head> .... <!--声明js代码域--> ...
- 用C#学习数据结构之链表
单链表的定义 链表是用一组任意的存储单元来存储线性表中的数据元素(这组存储单元可以是连续的,也可以是不连续的).那么,怎么表示两个数据元素逻辑上的相邻关系呢?即如何表示数据元素之间的线性关系呢?为此, ...
- 使用webpack将es6 es7转换成es2015
第一步:安装模块化包 cnpm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react 第二 ...
- SSH, 整合分页功能,连带DAO经典封装
任何一个封装讲究的是,使用,多状态.Action: 任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然 ...
- 让BIND9对任意域名查询都返回固定的IP地址
如何配置BIND9,使得向它发起的所有DNS请求都返回固定的IP地址?通过一些小技巧,可以实现. 下面是一个配置示例: 首先是主配置文件named.conf的配置: zone "." ...
- linux图形化客户端
很多服务器都用linux 但这些linux都是没有图形化界面的, 一般也不建议在服务器上装图形化界面 我们都知道,维护linux,大部分都是使用命令 那么,为什么不能开发一个应用程序, 把图形化操作转 ...
- Tomcat8源码笔记(一)Lifecycle接口
第一次阅读Tomcat8源码,就以Lifecycle作为笔记阅读的开篇吧,一千个读者就有一千个哈姆雷特,每个人都Tomcat的理解都不同,如果不记录一次Tomcat源码可能忘了就忘了. 断断DEBUG ...
- 使用Pabot并行运行RF案例
一.问题引入 在做接口自动化时随着案例增多,特别是流程类案例增多,特别是asp.net的webform类型的项目,再加上数据库校验也比较耗时,导致RF执行案例时间越来越长,就遇到这样一个问题,705个 ...
- 序列化(pickle,shelve,json,configparser)
一,序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据结构,这个过程叫序列化,不同的序列化,结果也不同,但是目的是一样的,都是为了存储和传输. 在 ...