cobbler二次开发接入点说明

原创
2016/03/25 18:34
阅读数 1.3K

cobbler作为一个批量自动化装机的开源工具,具有很好的系统支持性,给机房管理人员减轻了大量繁琐枯燥的安装配置过程。本文所讲的cobbler二次开发仅仅讲述cobbler安装客户机的实时日志的转发,和cobbler监听项目发送的指令的开发切入点,本文并不涉及到任何的实际代码逻辑。

一、anaconda监控日志转发接口切入点

由于anaconda监控程序是在客户机(被安装系统的机器)上运行的,其通过xml-rpc远程调用,使用http传输协议来把客户机的系统安装过程中的日志实时的发送给cobbler所在的服务器。而cobbler所在的服务器则会有相应的模块来监听这个请求。因此,实现anaconda监控日志转发至其他服务器又两种途径:

1.在客户机部分的anaconda代码中切入:

anaconda监控程序是在客户机获取dhcp分配的IP并从cobbler加载完成安装引导程序以及下载好镜像文件以后才开始工作的,而客户机这部分的anaconda程序就是在上述过程中一起被加载、安装到客户机中。

发送到客户机中的anaconda有一个关键的代码,即实时监控并将日志信息发送到cobbler所在的服务器的过程,而这部分代码的初始程序是在客户机的cobbler中的特定位置的,发送到客户机的anaconda程序就是从cobbler中的这一部分代码复制过去的,因此,我们只需在这部分代码中添加自己想要转发的目标IP和端口即可。

这段anaconda程序在服务器上的位置为:

/var/www/cobbler/aux/

在这个目录下有两个文件

anamon.py
anamon.init

当客户机开机后,这两个文件将一并发送到客户机中运行;且这两个文件定义了xml-rpc通过http请求分发客户机安装日志的位置。

anamon.py文件中有如下一部分代码:

session = xmlrpclib.Server("http://%s:%s/cobbler_api" % (server, port))

这部分代码就初始化了请求转发的服务器ip和端口,如果我们想增加一个转发的服务器或IP,只需要在这行的下面新增一个服务器IP即可,例如:

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服务器接收客户机返回的日志信息的主方法。因此,如果想要在服务器端实现日志转发,这个切入点是不错的选择。

二、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服务进程。

展开阅读全文
打赏
1
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
1
分享
返回顶部
顶部