python第五十二天---第九周作業 類 Fabric 主機管理程式

来源:http://www.cnblogs.com/uge3/archive/2017/06/23/7071121.html
-Advertisement-
Play Games

類 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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 數據類型 關鍵字 位元組數 數值型 整數型 byte 1 short 2 int 4 long 8 浮點型 float 4 double 8 布爾型 boolean 1(位) 字元型 char 2 ...
  • 今天在調試項目的時候出現下麵的錯誤信息: SoapFault looks like we got no XML document (D:\phpStudy\WWW\self.shop.xunmall.com\components\Proxy.php:477) #0 D:\phpStudy\WWW\s ...
  • Java2 平臺包括標準版(J2SE),企業版(J2EE)和為微縮版(J2ME)三個版本: Standard Edition(標準版)J2SE 包括那些構成Java語言核心的類。 例如:資料庫鏈接,介面定義,輸入/輸出,網路編程 Enterprise Edition(企業版)J2EE 包含J2SE中 ...
  • 題目背景 高手最近談戀愛了。不過是單相思。“即使是單相思,也是完整的愛情”,高手從未放棄對它的追求。今天,這個陽光明媚的早晨,太陽從西邊緩緩升起。於是它找到高手,希望在晨讀開始之前和高手一起在鰲頭山上一起散步。高手當然不會放棄這次夢寐以求的機會,他已經準備好了一切。 題目描述 鰲頭山上有n個觀景點, ...
  • import java.util.Arrays;//冒泡排序 public class Test { public static void main(String[] args) { int[] array = { 31, 22, 15, 77, 52, 32, 18, 25, 16, 7 }; /... ...
  • 題目背景 ·題目名稱是吸引你點進來的 ·實際上該題還是很水的 題目描述 ·1+1=? 顯然是2 ·a+b=? 1001回看不謝 ·哥德巴赫猜想 似乎已呈泛濫趨勢 ·以上純屬個人吐槽 ·給定一個正整數n,求將其分解成若幹個素數之和的方案總數。 輸入輸出格式 輸入格式: 一行:一個正整數n 輸出格式: ...
  • 題目描述 巫妖王的天災軍團終於卷土重來,血色十字軍組織了一支先鋒軍前往諾森德大陸對抗天災軍團,以及一切沾有亡靈氣息的生物。孤立於聯盟和部落的血色先鋒軍很快就遭到了天災軍團的重重包圍,現在他們將主力只好聚集了起來,以抵抗天災軍團的圍剿。可怕的是,他們之中有人感染上了亡靈瘟疫,如果不設法阻止瘟疫的擴散, ...
  • Plugins 摘一段來自MyBatis官方文檔的文字。 MyBatis允許你在某一點攔截已映射語句執行的調用。預設情況下,MyBatis允許使用插件來攔截方法調用: Executor(update、query、flushStatements、commint、rollback、getTransact ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...