cobbler二次開發接入點說明

cobbler做爲一個批量自動化裝機的開源工具,具備很好的系統支持性,給機房管理人員減輕了大量繁瑣枯燥的安裝配置過程。本文所講的cobbler二次開發僅僅講述cobbler安裝客戶機的實時日誌的轉發,和cobbler監聽項目發送的指令的開發切入點,本文並不涉及到任何的實際代碼邏輯。python

1、anaconda監控日誌轉發接口切入點

因爲anaconda監控程序是在客戶機(被安裝系統的機器)上運行的,其經過xml-rpc遠程調用,使用http傳輸協議來把客戶機的系統安裝過程當中的日誌實時的發送給cobbler所在的服務器。而cobbler所在的服務器則會有相應的模塊來監聽這個請求。所以,實現anaconda監控日誌轉發至其餘服務器又兩種途徑:linux

1.在客戶機部分的anaconda代碼中切入:

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)當你採用本方法時,只要有客戶機安裝系統,你所修改的這段代碼都會被髮送到客戶機,這種狀況下,多個客戶機實際上是一種併發發送請求的過程,注意在你的客戶端處理併發狀況。

2.在cobbler所在的服務器端進行切入

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服務器接收客戶機返回的日誌信息的主方法。所以,若是想要在服務器端實現日誌轉發,這個切入點是不錯的選擇。

2、web項目(JAVA)操縱cobbler服務的切入方法

在上篇文章中已經提到了JAVA向python請求數據的方法,本文將着重說明如何將這個cobbler服務器端的python進程和cobbler服務綁定到一塊兒(隨同cobbler服務同時中止和啓動)。

在/etc/init.d/cobblerd腳本文件中定義了cobbler服務的開啓和關閉的操做。那麼,咱們本身的進程一樣能夠綁定到這個linux腳本文件中,這樣作有如下好處:

  1. cobbler腳本中進行了不一樣系統的兼容性邏輯,直接寫入cobbler服務腳本能夠減小本身寫兼容性的問題;

  2. 省去了本身編寫linux命令的操做,這樣能夠大大減小因爲本身編寫linux命令而形成須要經過調試解決bug的瑣碎時間;

  3. 有助於快速注入多個自定義的進程。

例如,在cobblered腳本中有以下的方法:

start() {
...
}

stop(){
...
}
restart(){
...
}

咱們就能夠將本身的監聽線程寫入start()方法和stop()方法,經過這種方法,能夠方便的管理本身的進程和cobbler服務進程。

相關文章
相關標籤/搜索