cobbler做爲一個批量自動化裝機的開源工具,具備很好的系統支持性,給機房管理人員減輕了大量繁瑣枯燥的安裝配置過程。本文所講的cobbler二次開發僅僅講述cobbler安裝客戶機的實時日誌的轉發,和cobbler監聽項目發送的指令的開發切入點,本文並不涉及到任何的實際代碼邏輯。python
因爲anaconda監控程序是在客戶機(被安裝系統的機器)上運行的,其經過xml-rpc遠程調用,使用http傳輸協議來把客戶機的系統安裝過程當中的日誌實時的發送給cobbler所在的服務器。而cobbler所在的服務器則會有相應的模塊來監聽這個請求。所以,實現anaconda監控日誌轉發至其餘服務器又兩種途徑:linux
anaconda監控程序是在客戶機獲取dhcp分配的IP並從cobbler加載完成安裝引導程序以及下載好鏡像文件之後纔開始工做的,而客戶機這部分的anaconda程序就是在上述過程當中一塊兒被加載、安裝到客戶機中。web
發送到客戶機中的anaconda有一個關鍵的代碼,即實時監控並將日誌信息發送到cobbler所在的服務器的過程,而這部分代碼的初始程序是在客戶機的cobbler中的特定位置的,發送到客戶機的anaconda程序就是從cobbler中的這一部分代碼複製過去的,所以,咱們只需在這部分代碼中添加本身想要轉發的目標IP和端口便可。shell
這段anaconda程序在服務器上的位置爲:api
/var/www/cobbler/aux/
在這個目錄下有兩個文件服務器
anamon.py anamon.init
當客戶機開機後,這兩個文件將一併發送到客戶機中運行;且這兩個文件定義了xml-rpc經過http請求分發客戶機安裝日誌的位置。session
anamon.py文件中有以下一部分代碼:併發
session = xmlrpclib.Server("http://%s:%s/cobbler_api" % (server, port))
這部分代碼就初始化了請求轉發的服務器ip和端口,若是咱們想增長一個轉發的服務器或IP,只須要在這行的下面新增一個服務器IP便可,例如:app
session = xmlrpclib.Server("http://%s:%s/cobbler_api" % (server, port)) session1 = xmlrpclib.Server("http://192.168.10.23:8087/cobbler_api")
這樣就初始化了兩個rpc服務,而後接着查看anamon.py文件有的下面的代碼片斷:工具
def uploadWrapper(self, blocksize=262144): """upload a file in chunks using the uploadFile call""" retries = 3 fo = file(self.fn, "r") totalsize = os.path.getsize(self.fn) ofs = 0 while True: lap = time.time() contents = fo.read(blocksize) size = len(contents) data = base64.encodestring(contents) if size == 0: offset = -1 sz = ofs else: offset = ofs sz = size del contents tries = 0 while tries <= retries: debug("upload_log_data('%s', '%s', %s, %s, ...)\n" % (name, self.alias, sz, offset)) if session.upload_log_data(name, self.alias, sz, offset, data): break else: tries = tries + 1 if size == 0: break ofs += size fo.close()
這個方法就是實現客戶機向cobbler服務器發送數據的方法,在這個方法中的以下代碼實現了發送的實際過程:
session.upload_log_data(name, self.alias, sz, offset, data)
上面的這行代碼即調用了服務器端的upload_log_data方法(這個方法在第二種實現方法中有介紹)
咱們只需在此處新增部分代碼,便可實現將日誌信息轉發至另外的服務器中,實現的代碼,見我上一篇博客。
注意:
1)採用這種方法實現是有要求的,就是:客戶機必須可以和你要新增的轉發服務器ping通,不然,這種方法不適用。
2)當你採用本方法時,只要有客戶機安裝系統,你所修改的這段代碼都會被髮送到客戶機,這種狀況下,多個客戶機實際上是一種併發發送請求的過程,注意在你的客戶端處理併發狀況。
cobbler服務器所在的切入點就是cobbler服務所在的地方,這部分在下面的文件路徑下:
/usr/lib/python2.6/site-packages/cobbler/
個人python是2.6的,所以爲此目錄,根據本身使用的版本的不一樣選擇對應的python版本便可進入。
在上述目錄下有remote.py文件,須要在本文件中有以下方法:
def upload_log_data(self, sys_name, file, size, offset, data, token=None,**rest)
這個方法是cobbler服務器接收客戶機返回的日誌信息的主方法。所以,若是想要在服務器端實現日誌轉發,這個切入點是不錯的選擇。
在上篇文章中已經提到了JAVA向python請求數據的方法,本文將着重說明如何將這個cobbler服務器端的python進程和cobbler服務綁定到一塊兒(隨同cobbler服務同時中止和啓動)。
在/etc/init.d/cobblerd腳本文件中定義了cobbler服務的開啓和關閉的操做。那麼,咱們本身的進程一樣能夠綁定到這個linux腳本文件中,這樣作有如下好處:
cobbler腳本中進行了不一樣系統的兼容性邏輯,直接寫入cobbler服務腳本能夠減小本身寫兼容性的問題;
省去了本身編寫linux命令的操做,這樣能夠大大減小因爲本身編寫linux命令而形成須要經過調試解決bug的瑣碎時間;
有助於快速注入多個自定義的進程。
例如,在cobblered腳本中有以下的方法:
start() { ... } stop(){ ... } restart(){ ... }
咱們就能夠將本身的監聽線程寫入start()方法和stop()方法,經過這種方法,能夠方便的管理本身的進程和cobbler服務進程。