❶ 純干貨!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中scp遠程拷貝文件
Python不僅支持Web開發,還提供了強大的文件傳輸功能。比如,在Python中使用scp模塊進行遠程文件拷貝是一種常見的需求。scp模塊允許你通過SSH協議安全地傳輸文件,適用於需要自動化文件傳輸的任務。
為了使用scp模塊,你需要先安裝paramiko庫,這是一個功能豐富的SSH2協議實現。安裝命令為:pip install paramiko。安裝完成後,你可以使用如下代碼示例進行遠程文件拷貝:
python
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostname', username='username', password='password')
sftp = ssh.open_sftp()
sftp.put('local_file_path', 'remote_file_path')
sftp.close()
ssh.close()
在上述代碼中,`hostname`、`username`、`password`需要替換為具體的遠程伺服器信息,而`local_file_path`和`remote_file_path`分別是本地文件路徑和遠程文件路徑。這段代碼首先通過SSH連接到遠程伺服器,然後使用SFTP協議進行文件傳輸,最後關閉連接。
需要注意的是,scp模塊依賴於SSH,因此必須確保遠程伺服器上安裝了SSH服務,並且能夠通過用戶名和密碼或密鑰進行登錄。此外,scp模塊不支持Windows系統,如果你在Windows上運行Python,請考慮使用其他方法,如使用Fabric或paramiko的其他功能。
總之,Python的scp模塊提供了一種方便的方式來進行遠程文件拷貝,特別適用於自動化腳本和持續集成環境。通過學習和實踐,你可以輕松地將這項技術應用到實際項目中。
另外,除了scp模塊,Python還有其他一些庫和框架可以幫助你實現文件傳輸功能。例如,使用paramiko的SFTP介面可以實現更復雜的文件操作,如文件刪除、文件重命名等。這些功能可以讓你的文件傳輸任務更加靈活和強大。
總的來說,Python的Web框架如Django、Flask等主要用於Web開發,與文件傳輸功能沒有直接關聯。不過,這些框架可以幫助你構建完整的應用程序,其中可能包括文件上傳和下載功能。對於文件傳輸需求,scp模塊或paramiko庫是更合適的選擇。
❸ 如何用python將ftp文件進行下載並上傳到伺服器指定目
Python通過ftplib庫與FTP伺服器進行交互,實現文件下載與上傳。具體步驟如下:
1. 首先,導入ftplib庫,創建FTP對象並登錄FTP伺服器。
2. 使用`retrbinary()`方法下載FTP文件。傳遞文件名和一個回調函數,該函數接收文件內容並將其存儲。
3. 使用`storbinary()`方法上傳文件到FTP伺服器。傳遞文件名、一個打開的文件對象和一個回調函數,該函數接收伺服器的應答。
4. 通過`quit()`或`close()`方法關閉FTP連接。
使用ftplib進行FTP操作適用於標准FTP服務,但存在安全性問題。
與之相比,SFTP(SSH文件傳輸協議)提供更安全的文件傳輸。Python通過paramiko庫支持SFTP。
1. 首先,確保已經安裝了paramiko庫。若未安裝,使用pip命令安裝。
2. 使用`Transport`類建立SSH連接。
3. 創建`SFTPClient`對象,通過SSH連接進行文件操作。
4. 使用`SFTPClient`對象的`get()`方法下載SFTP文件,或`put()`方法上傳文件。
5. 結束SFTP會話,關閉SSH連接。
SFTP提供加密傳輸,相較於標准FTP更安全。
總結,ftplib用於基本的FTP操作,適合非加密環境;而paramiko庫支持安全的SFTP協議,適用於需要加密傳輸的場景。