基於腳本的服務器集群管理工具
背景:
隨着雲計算服務的普及,基於雲計算的PaaS、IaaS受到越來越多的關注,使用這些服務的用戶也越來越多。對於一些大型的應用而言,可能包含多種服務,而這些服務需要部署在多台服務器上。例如:某個應用可能部署了10台數據庫服務器,10台Web Http服務器以及5台靜態文件存儲服務器等。那么作為應用程序管理員來說,一台一台地登錄去管理這些機器顯得非常繁瑣,而且對於同一種服務(比如數據庫服務)的機器需要執行的管理任務又都大致相同,那么對每台機器進行重復的工作也會增加集群管理員的負擔。
應對上述需求場景,我開發了這樣一個基於腳本的服務器集群管理工具,它主要具有如下功能和優點:
1、 針對不同應用場景,對服務器進行高效的分組管理。
2、 以可執行腳本作為子任務,可以自定義腳本內容,具有高度靈活性。以多個腳本組成的有序組序列作為可執行任務單元。腳本可分組,同組內可排序,有效組織和管理。
3、 針對不同需求,創建“服務器組<->腳本組”的執行任務。隨時啟動該任務,便可下達對該服務器組的基於腳本序列的任務執行命令。
4、 提供對“服務器組<->腳本組”的執行任務的運行狀態查詢,便於監控。可以查看遠程服務器控制台的輸出顯示,當前運行狀態,執行到哪個腳本,哪個腳本有異常等等信息。
應用場景舉例:
假如我想為我的10台機器同時安裝LAMP。那么首先我們建立一個服務器組server_group,並將這10台機器加入到該組中。接下來,我們創建三個腳本,分別為Setup_Apache,Setup_Mysql,Setup_PHP,然后我們再創建一個腳本組,命名為LAMP_Group,並將前面的三個腳本添加到該組來,並在組內排好順序(針對有執行順序要求的任務)。最后,我們創建一個可執行任務<server_group , LAMP_Group>並執行,再狀態查詢頁面中監控該任務的在不同服務器上的個腳本執行情況。
過一段時間,我又想為另一個服務器組安裝某些服務,也需要使用到Mysql ,那么就可以將之前創建的Setup_Mysql腳本復用添加,再增加一些其他需要的腳本,生成新的腳本組。
或是,我突然想查看集群上的某個日志文件,那么編寫一個將日志文件內容打印到控制台的腳本,對該集群執行該腳本,再通過監控頁面得到遠程主機的控制台輸出結果,方便查看。
技術實現過程中的關鍵點:
1、如何將腳本文件拷貝到遠程主機上;
基於pexpect,使用scp命令,進行腳本文件的遠程拷貝,因為scp是成熟的命令,可以確保文件的完整性與安全性。
2、如何觸發遠程主機上腳本的執行;
觸發腳本執行功能使用的pexpect提供的pxssh模塊,該模塊式是對pexpect核心模塊的進一步封裝,並用於實現基於ssh方式通信的交互模塊。由於,腳本的執行效果與耗時都是無法預知的,客戶端觸發腳本執行命令后不可能一直等待這些腳本進程結束。因此,在下達執行命令后,客戶端應該立即結束自身,而執行腳本應該把運行過程中產生的輸出內容重定向寫入到某個日志文件中,客戶端獲取該文件得到輸出結果。
由於主要耗時在網絡通信,因此對多台主機采用多線程的方式進行處理。
3、如何獲取腳本的運行狀態與執行結果。
有一些重要的問題需要考慮:客戶端如何獲知這些腳本的執行是否已經結束了?它們是正常結束的,還是出錯掛掉的?以及當前正在運行的是哪個腳本文件? 因此,我們需要獲取這些腳本執行進程的狀態。在linux上,一般用ps命令進行進程狀態的查看,使用grep可以進行內容的篩選。在這里,我們利用某種標識串對每個腳本進行標識,這樣使用“ps -aux | grep 標識串”命令就可以查看該執行腳本的進程狀態了。為了判斷腳本文件執行是否是正常退出的,我們在按序執行這些腳本后在日志文件結尾插入一個標識串。如果日志文件中,存有該標志串則證明是正常結束的,否則可能仍在執行或是發生了某些錯誤。程序里,使用了一些小技巧。
截圖及說明:
技術實現:
系統環境:linux(ubuntu)
使用到技術及模塊:python2.6 ,pexpect ,web.py(輕量級web框架) , sqlalchemy(ORM) , mysql , jQuery , Twitter Bootstrap。
一些說明:
0、 項目包括控制台console和web兩個應用
Console 通過根據配置文件作為參數執行命令,web則更好的可以進行服務器、腳本、任務的可視化系統管理。
Console執行:./run_task.py tasks.xml
Web啟動:./start.sh 通過瀏覽器訪問,默認端口8080(該文件夾下的database.conf為mysql數據庫的配置)
1、被管理的server需為unix(linux)系統,且裝有ssh server(即可以ssh遠程登錄)。
2、腳本頭部請填寫類似“#!/usr/bin/python”等說明,以確保其可以正常執行。
3、該項目目前只開發了一個大致的框架,由於課業壓力較大,時間倉促,項目里一些細節的東西可能還需進一步完善。