內附源碼!實現60臺服務器跨平臺自動化運維的Python小神器
本文由馬哥教育Python自動化實戰班5期學員推薦,轉載自互聯網,作者為kaifly,內容略經小編改編和加工,觀點跟作者無關,最后感謝作者的辛苦貢獻與付出。
Python是吉多·范羅蘇姆發明的一種面向對象的腳本語言,可能有些人不知道面向對象和腳本具體是什么意思,但是對于一個初學者來說,現在并不需要明白。大家都知道,當下全棧工程師的概念很火,而Python是一種全棧的開發語言,所以你如果能學好Python,那么前端,后端,測試,大數據分析,爬蟲等這些工作你都能勝任。
這陣子一直在學Python,碰巧最近想把線上服務器環境做一些規范化/統一化,于是便萌生了用Python寫一個小工具的沖動。
就功能方面來說,基本上是在“重復造輪子”吧,但是當我用這小工具完成了30多臺服務器從系統層面到應用層面的一些規范化工作之后,覺得效果還不算那么low(高手可忽略這句話~~),這才敢拿出來跟小伙伴們分享一下。
(注:筆者所用為Python版本為3.5,其他版本未經測試~~)
經過數次修改(最新修改日期 20170320),現在主要功能包括:
- 可批量執行遠程命令,上傳下載文件
- 支持多線程并發執行(對于某些耗時的命令或上傳文件,可大大減少等待時間)
- 嚴格模式(批量執行中若某一臺server執行錯誤則退出)和非嚴格模式
- 上傳下載文件實現了類似rsync的機制
- 完善的命令行提示
- 跨平臺,Linux和Windows均可
大致實現思路如下:
外部包依賴docopt和paramiko
有一個server信息文件,內容格式為 : “主機名-IP:端口”。腳本讀取此文件來決定要對哪些server進行操作(該文件內部支持#注釋掉某些server)
采用了docopt提供命令行界面
paramiko模塊實現遠程命令和sftp客戶端功能。這里paramiko的sftp實例其只包含了基本的單個文件傳輸功能;并且不保存文件相關時間信息。
paramiko 通過sftp實例傳輸文件環節,這里額外實現“保持文件時間信息”和“實現目錄傳輸”以及“實現類似rsync的傳輸機制”是要考慮很多問題和邏輯的。傳輸機制模仿rsync的默認機制,檢查文件的mtime和size,有差異才會真正傳輸。
實現了參數中原路徑和目標路徑的自動判斷,例如傳輸目錄時不要求路徑后面加‘/’
對于遠程命令(cmd),可以通過設置(--skip-err)跳過某些server的錯誤繼續執行。例如批量執行‘ls’命令,一般情況會因為某些server上不存在而報錯退出
全面的錯誤信息提示。對于執行中的幾乎所有可能出現的錯誤,都有捕獲機制獲取并輸出
下面先來看一些基本的使用截圖吧
幫助信息:

批量執行遠程命令:

上傳:

下載:

其實批量執行命令,傳輸文件在Linux上用shell也是可以很好的實現(而且ssh或rsync等也肯定比這套腳本功能點更多),但是考慮到并發執行以及在Linux和win平臺的通用性,用Python來實現就有必要了。尤其是想在Win客戶端和Linux服務器之間模仿rsync機制傳輸文件時,這個腳本就能派上用場了。
另外腳本里包含了兩個有用的函數(類):
print_color()函數方便的在Linux下實現打印不同顏色的字體;
OutputText類在多線程任務需要在中終端打印結果時會非常有用
其實之所以想造這么一個輪子,一方面能鍛煉Python coding,另一方面當時確實有這么一個需求。而且用自己的工具完成工作也是小有成就的(請勿拍磚~)。
另外,在開發過程中對于一些概念性的東西也都有了更深入的了解:
例如在使用paramiko模塊的過程中,又促使我深入的了解了一些ssh登陸的詳細過程。
又如用到了線程模型,更深入的了解了線程進程相關的概念。
所以作為一枚運維老司機,越來越深刻的理解到“運維”和“開發”這倆概念之間的相互促進。希望大家共勉。
需要本Python代碼請回復關注公眾號回復:Python神器