cobbler作为一个批量自动化装机的开源工具,具有很好的系统支持性,给机房管理人员减轻了大量繁琐枯燥的安装配置过程。本文所讲的cobbler二次开发仅仅讲述cobbler安装客户机的实时日志的转发,和cobbler监听项目发送的指令的开发切入点,本文并不涉及到任何的实际代码逻辑。
由于anaconda监控程序是在客户机(被安装系统的机器)上运行的,其通过xml-rpc远程调用,使用http传输协议来把客户机的系统安装过程中的日志实时的发送给cobbler所在的服务器。而cobbler所在的服务器则会有相应的模块来监听这个请求。因此,实现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)当你采用本方法时,只要有客户机安装系统,你所修改的这段代码都会被发送到客户机,这种情况下,多个客户机其实是一种并发发送请求的过程,注意在你的客户端处理并发情况。
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服务进程。