類 Fabric 主機管理程式開發:1. 運行程式列出主機組或者主機列表2. 選擇指定主機或主機組3. 選擇讓主機或者主機組執行命令或者向其傳輸文件(上傳/下載)4. 充分使用多線程或多進程5. 不同主機的用戶名密碼、埠可以不同 README 1 import configparser 2 imp ...
類 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#視圖啟動
1 import configparser 2 import os ,sys 3 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#獲取相對路徑轉為絕對路徑賦於變數 4 sys.path.append(BASE_DIR)#增加環境變數 5 from core.main import loging 6 if __name__ == '__main__': 7 8 loging()View Code
| |- - -user_reg.py#主機添加啟動
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#獲取相對路徑轉為絕對路徑賦於變數 8 sys.path.append(BASE_DIR)#增加環境變數 9 from cfg import config 10 #修改個信息 磁碟大小 11 def set_info(gr_name,addse,name,pwd,ports): 12 config_info=configparser.ConfigParser()#讀數據 13 file_dir='%s%s'%(config.AUTH_FILE,gr_name)#主機組用戶名密碼文件路徑 14 15 config_info[addse]={}#ip 主機 16 config_info.set(addse,config.USER,name)#用戶 17 config_info.set(addse,config.PWD,pwd)#密碼 18 config_info.set(addse,config.PORTS,ports)#埠 19 with open(file_dir,'a') as f: 20 config_info.write(f)#寫入文件 21 #config_info.write(open(file_dir,'a'))#寫入文件 22 print('創建完成'.center(60,'=')) 23 print('組:【%s】\nIP:[%s]\n用戶名:[%s]\n密碼:[%s]\n埠:[%s]'%(gr_name,addse,name,pwd,ports)) 24 25 if __name__ == '__main__': 26 gr_name=input('組名:')#組 27 addse=input('IP地址:')#ip地址 28 name=input('用戶名:')#用戶 29 pwd=input('密碼:')#密碼 30 ports=input('埠:')#埠 31 32 set_info(gr_name,addse,name,pwd,ports)View Code
|- - -cfg/#配置目錄
| |- - -__init__.py
|- - -config.py#配置文件
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#獲取相對路徑轉為絕對路徑賦於變數 8 sys.path.append(BASE_DIR)#增加環境變數 9 10 AUTH_FILE='%s/db/'%BASE_DIR#主機組 信息用戶名密碼文件路徑 11 FILE_DIR='%s/put_file'%BASE_DIR#要上傳文件所在的目錄 12 GET_FILE_DIR='%s/get_file'%BASE_DIR#要上傳文件所在的目錄 13 #print(AUTH_FILE) 14 PWD='pwd'#密碼 15 USER='user' 16 PORTS='ports' 17 INST_LIST=['put','get']#指令列表 18 19 PUT='put' 20 GET='get'View Code
|- - -core/#下載文件目錄
| |- - -__init__.py
| |- - -main.py#主要邏輯 類
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 5 import configparser 6 import os ,sys 7 import threading,time 8 import paramiko,queue 9 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#獲取相對路徑轉為絕對路徑賦於變數 10 sys.path.append(BASE_DIR)#增加環境變數 11 from cfg import config 12 13 class Fabric_gr(object): 14 def __init__(self,gr_name):#組名 15 self.gr_name='%s%s'%(config.AUTH_FILE,gr_name)#主機組用戶名密碼文件路徑 16 self.config_info=configparser.ConfigParser()#讀數據對象 17 self.name_l=[]#定義一個列表 18 self.attr=[] 19 self.file_dir=''#上傳文件路徑 20 self.get_file=''#下載傳文件路徑 21 22 def group_open(self):#打開組文件 23 self.config_info.read(self.gr_name)#讀取文件 24 for i in range(len(self.config_info.sections())): 25 self.name_l.append(self.config_info.sections()[i])#信息添加到列表 26 else: 27 print('主機列表:'.center(40,'=')) 28 for i in self.name_l: 29 print(('[%s]'%i).center(40,' ')) 30 31 def inst_attr(self,inst):#獲取指令 32 self.instruction=inst 33 self.attr=self.instruction.split() 34 self.inst_a=self.attr[0] 35 36 def inst(self):#指令判斷 37 if self.inst_a in config.INST_LIST: 38 return True 39 else: 40 return False 41 42 def open_list(self):#創建 線程 方法 43 if self.inst_a==config.PUT: 44 if self.File_Dir():#查找本地文件 45 pass 46 else: 47 return 48 self.re_lilst=[]#定義一個列表 49 for j in range(len(self.name_l)): 50 sttr=self.config_info.sections()[j]#獲取到對象 51 user_dict={}#創建一個空字典 52 for i,v in self.config_info[sttr].items():#可以迴圈輸出 獲ip 用戶 密碼 埠 53 user_dict[i]=v 54 sttr=threading.Thread(target=self.thr_run,args=(sttr,user_dict[config.USER],user_dict[config.PWD],int(user_dict[config.PORTS])))#創建新線程 55 sttr.start()#啟動線程 56 self.re_lilst.append(sttr)#不用JOIN,避免阻塞為串列 57 else: 58 for i in self.re_lilst:#等待線程 完成 59 i.join() 60 61 def open_list2(self):#創建 線程 方法 62 self.re_lilst=[]#定義一個列表 63 for j in range(len(self.name_l)): 64 sttr=self.config_info.sections()[j]#獲取到對象 65 user_dict={}#創建一個空字典 66 for i,v in self.config_info[sttr].items():#可以迴圈輸出 獲ip 用戶 密碼 埠 67 user_dict[i]=v 68 sttr=threading.Thread(target=self.ssh_run,args=(sttr,user_dict[config.USER],user_dict[config.PWD],int(user_dict[config.PORTS])))#創建新線程 69 sttr.start()#啟動線程 70 self.re_lilst.append(sttr)#不用JOIN,避免阻塞為串列 71 else: 72 for i in self.re_lilst:#等待線程 完成 73 i.join() 74 75 76 def thr_run(self,addrs,user,paswd,ports):#傳輸通道 77 try: 78 transport=paramiko.Transport((addrs,ports))#傳輸模塊 Transport 伺服器地址 埠 79 transport.connect(username=user,password=paswd)#用戶名,,密碼 80 sftp=paramiko.SFTPClient.from_transport(transport)#調用傳輸方法 81 print('[%s]連接成功!'%addrs) 82 self.file_dir='%s/%s'%(config.FILE_DIR,self.attr[1])#上傳文件路徑 83 if self.inst_a==config.PUT: 84 sftp.put(self.file_dir,self.attr[2])#上傳文件 ,本地路徑文件 ,伺服器的路徑文件 85 print('【%s】文件上傳完成!'%addrs) 86 elif self.inst_a==config.GET: 87 self.get_file='%s/%s_%s'%(config.GET_FILE_DIR,addrs,self.attr[2])#下載文件路徑 88 print(self.get_file) 89 sftp.get(self.attr[1],self.get_file)#下載文件 ,伺服器的路徑文件 ,本地路徑文件 90 print('【%s】文件下載完成!'%addrs) 91 else: 92 print('【%s】文件相關操作失敗!'%addrs) 93 pass 94 except Exception as e: 95 print(e) 96 97 def File_Dir(self):#判斷文件是否存在 98 file=self.attr[1] 99 100 print(file) 101 self.file_dir='%s/%s'%(config.FILE_DIR,file)#文件路徑 102 if os.path.isfile(self.file_dir): 103 print('成功找到文件!') 104 return True 105 else: 106 print('文件不存在!') 107 return False 108 def ssh_run(self,addrs,user,paswd,ports):#ssh 109 ssh =paramiko.SSHClient()#創建一個SSH連接對象 110 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#允許連接不在KNOV_HOSTs文件中的主機 自動添加 111 try: 112 ssh.connect(hostname=addrs,port=ports,username=user,password=paswd)#連接,主機 埠 用戶名 密碼 113 print('[%s]連接成功!'%addrs) 114 except Exception as e: 115 print(e) 116 return 117 stdin,stdout,stderr=ssh.exec_command(self.instruction)#.exec_command 為執行命令,返回結果 ,標準輸入,標準輸出,標準錯誤,錯誤與輸出只會返回其一 118 result=stdout.read()#獲取結果 119 try: 120 if len(result)<1:#如果為空 返回錯誤信息 121 result=stderr.read() 122 print(addrs.center(60,'=')) 123 print(result.decode()) 124 else: 125 print(addrs.center(60,'=')) 126 print(result.decode()) 127 except Exception as e: 128 print(e) 129 130 131 info_l='''--------指令幫助-------- 132 上傳文件: put file /home/tmp/file (指令 本地文件 服務端位置文件) 133 下載文件: get /home/tmp/file file (指令 服務端位置文件 本地文件) 134 其他指令: ssh相關命令 如 df pwd ifconfig ls等 135 查看幫助: helps 136 返回上層: quit 137 退出程式: exit 138 ''' 139 140 141 def loging(): 142 print(info_l) 143 while True: 144 s=os.listdir(config.AUTH_FILE) 145 print('主機組'.center(60,'=')) 146 for i,v in enumerate(s): 147 print('編號:%s 組名:%s'%(i,v)) 148 gr_name=input('選擇組:') 149 if gr_name=='exit': 150 exit() 151 if gr_name=='helps': 152 print(info_l) 153 continue 154 try: 155 gr_file=s[int(gr_name)] 156 157 lst=Fabric_gr(gr_file)#實例連接 158 lst.group_open()#打開 159 while True: 160 #print(info_l) 161 inst=input('指令>>>:') 162 if inst=='exit': 163 exit() 164 if inst=='quit': 165 continue 166 if inst=='helps': 167 print(info_l) 168 continue 169 lst.inst_attr(inst)#獲取指令 170 if lst.inst():#指令判斷 171 lst.open_list()#開啟線程創建 172 else: 173 lst.open_list2() 174 pass 175 except ValueError as e: 176 print(e)View Code