㈠ 純干貨!python 在運維中的應用 (一):批量 ssh/sftp
日常工作中需要大量、頻繁地使用ssh到伺服器查看、拉取相關的信息或者對伺服器進行變更。目前公司大量使用的shell,但是隨著邏輯的復雜化、腳本管理的精細化,shell已經不滿足日常需求,於是我嘗試整合工作中的需求,製作適合的工具。 由於管理制度的缺陷,我以工作流程為核心思考適合自己的運維方式,提升工作效率,把時間留給更有價值的事情。 完整代碼在最後,請大家參考。
生產:4000+物理伺服器,近 3000 台虛擬機。
開發環境:python3.6、redhat7.9,除了paramiko為第三方模塊需要自己安裝,其他的直接import即可。
批量執行操作是一把雙刃劍。批量執行操作可以提升工作效率,但是隨之而來的風險不可忽略。
風險案例如下:
掛載很多數據盤,通常先格式化硬碟,再掛載數據盤,最後再寫入將開機掛載信息寫入/etc/fstab文件。在批量lsblk檢查硬碟信息的時候發現有的系統盤在/sda有的在/sdm,如果不事先檢查機器相關配置是否一致直接按照工作經驗去執行批量操作,會很容易造成個人難以承受的災難。
在執行批量操作時按照慣例:格式化硬碟->掛載->開機掛載的順序去執行,假設有的機器因為某些故障導致格式化硬碟沒法正確執行。在處理這類問題的時候通常會先提取出失敗的ip,並再按照慣例執行操作。運維人員會很容易忽略開機掛載的信息已經寫過了,導致復寫(這都是血和淚的教訓)。
所以,為了避免故障,提升工作效率,我認為應當建立團隊在工作上的共識,應當遵守以下原則:
當然,代碼的規范也應當重視起來,不僅是為了便於審計,同時也需要便於溯源。我認為應當注意以下幾點:
1、ssh no existing session,sftp超時時間設置:
在代碼無錯的情況下大量ip出現No existing session,排查後定位在代碼的寫法上,下面是一個正確的示例。由於最開始沒考慮到ssh連接的幾種情況導致了重寫好幾遍。另外sftp的實例貌似不能直接設置連接超時時間,所以我採用了先建立ssh連接再打開sftp的方法。
2、sftp中的get()和put()方法僅能傳文件,不支持直接傳目錄:
不能直接傳目錄,那換個思路,遍歷路徑中的目錄和文件,先創建目錄再傳文件就能達到一樣的效果了。在paramiko的sftp中sftp.listdir_attr()方法可以獲取遠程路徑中的文件、目錄信息。那麼我們可以寫一個遞歸來遍歷遠程路徑中的所有文件和目錄(傳入一個列表是為了接收遞歸返回的值)。
python自帶的os模塊中的os.walk()方法可以遍歷到本地路徑中的目錄和文件。
3、多線程多個ip使用sftp.get()方法時無法並發。
改成多進程即可。
4、多個ip需要執行相同命令或不同的命令。
由於是日常使用的場景不會很復雜,所以借鑒了ansible的playbook,讀取提前准備好的配置文件即可,然後再整合到之前定義的ssh函數中。
同時,我們還衍生出一個需求,既然都要讀取配置,那同樣也可以提前把ip地址准備在文件里。正好也能讀取我們返回的執行程序的結果。
參數說明:
密碼認證:
公鑰認證:
可以配合 grep,awk 等命令精準過濾。
個人認為 Python 在初中級運維工作中的性質更像是工具,以提升工作效率、減少管理成本為主。可以從當前繁瑣的工作中解脫出來,去 探索 更有價值的事情。python 本質上並不會減少故障的產生,所以在不同的階段合理利用自身掌握的知識解決當前最重要的痛點,千萬不要本末倒置。
㈡ python使用paramiko模塊ssh遠程linux伺服器,linux伺服器已經使用公鑰認證免密碼登陸,請問怎麼寫
1.可密碼搭游、公私鑰認證,實現sftp文件上傳下載
2.腳本知笑銷
a.顯示命令行幫助:pythonsftp_downloader.py-h
b.運行:pythonsftp_downloader.py-uzhangsan-ppassword-pkmy-openssh-private-key-sfmy-server-list-file-path-srcfthe-file-name-to-be-download-ddthe-file-dir-to-save_vote
c.可把b中的命名設置成alias(windows平台我用的Cmder終端,可設置alias),使用就簡單了
4.腳本說明:
a.argparse模塊使用接收命令行參數,然後分別設置_vote_tie_follow來區分要下載不同類型的伺服器日誌與傳不同的日誌路徑
b.easylog模塊,自己封裝的日誌模塊
c.gevent,對文件中的多個伺服器地址使用協程來加快下載
d.paramiko模塊,核心使用,ssh連接認證
e.只封裝了下載,上傳、執行伺服器命令等可以自己再擴展
d.當升扮前只是為了滿足方便使用,有很多地方可以調和糾錯,指正。
㈢ python通過paramiko模塊ssh登陸linux客戶端,執行需要輸入 yes/no 或 y/n 確認的命令在python中怎麼寫
r = raw_input('晌宏襪毀[y]es/[n]o'宴好冊)
if r[0] == 'y':
...
elif r[0] == 'n':
...