在上篇文章中我们说到了Cobbler API,但是由于Cobbler api在cobbler 2.2以上版本不再建议使用(这其中的缘由在cobbler API介绍那篇文章中已经说明,此处不再赘述),而建议使用rpc来操纵cobbler。
本文将着重讲述如何使用rpc来操纵cobbler;本文翻译的源网站为:https://fedorahosted.org/cobbler/wiki/CobblerXmlrpc
XMLRPC是一个用不同语言编写的通过网络进行交互的轻量级计算机程序。详情见:http://www.xmlrpc.com/
如果你想在cobbler 上实现以下目的,你应该使用XMLRPC API:
1.你想跟Cobbler进行交互,但是你的应用不是python的程序/脚本;
2.你想跟Cobbler进行交互,但是你的程序没有运行在Cobbler服务器上;
3.你有一个non-GPLd应用程序,并且想跟Cobbler交互,并被分发给公众或其他的客户。
使用Cobbler的XMLRPC API,首先你必须设置CustomizableSecurity(cobbler 2.2以上已经默认设置了),并且确保Apache和cobblerd在你的Cobbler服务中运行了。如果你使用了authn_spacewalk 模块,请在/etc/cobbler/settings文件中将redhat_management_permissive值设置为1。
将会在下面给出一些使用python调用XMLEPC的例子,但是XMLRPC应该可以很容易的和其他的任何语言进行绑定(使用任何语言进行调用XMLRPC)。例如,Java和Ruby已经和XMLRPC坚实的和XMLRPC绑定了。
使用Cobbler XMLRPC 的API进行任何操作,首先都必须连接到Cobbler,下面是一个例子:
import xmlrpclib
server = xmlrpclib.Server("http://192.168.12.14/cobbler_api")
上面的IP即Cobbler服务器的IP
如果不登录,Cobbler的信息可能会可以被读取到,但是如果你想在Cobbler服务器上进行任何修改的操作,或启动操作,登录的令牌是必须的。一旦获取了令牌,这个令牌就可以传递给被调用的且需要令牌作为最后一个参数的任何一个远程函数。
一个令牌每隔60分钟将被更新一次。如果令牌过期,则需要重新获取登录令牌来取得登录凭证。
token = server.login("username","password")
注意:这里的用户名和密码是cobbler 的用户名和密码,设置Cobbler用户名和密码的命令如下:
htdigest /etc/cobbler/users.digest "Cobbler" cobbler
上述命令将会添加一个名为cobbler的用户,可以自己决定添加什么用户名,回车后需要连续输入两次密码。
远程操作的问题/错误将会作为XMLRPC远程错误返回(远程 CobblerExceptions ? ),而不是返回一个状态代码。这就可以防止调用方法来检查繁琐的返回状态代码。
相反的,和查询相关的方法,以及调用登录返回的数据,没有实际意义,可以被忽略。
想要查看distros, profiles, systems, images, 或者 repos ,或者远程服务器的定义。这些东西很容易就可以获取到:
#!/usr/bin/python
import xmlrpclib
server = xmlrpclib.Server("http://127.0.0.1/cobbler_api")
print server.get_distros()
print server.get_profiles()
print server.get_systems()
print server.get_images()
print server.get_repos()
上述每种方法返回描述远程数据的嵌套哈希,并且表示每一个Cobbler对象中的每个字段的列表。
相对与检索给定类型的所有对象,它通常更容易直接搜索你想要的东西。
print server.find_distro({"name":"F*"})
上面的例子返回所有以“F”开头并且适用与所有对象类型的分发(distro).它就像在CobblerApi页面的搜索列表,任何字段的类型都可以被搜索。例如:
print server.find_system({"hostname":"*.lab.example.org"})
列表中返回的数据就和从get_distros() 、 get_systems()等方法中获取的数据相似,只是仅包含匹配的结果。
你想查看上次使用XMLRPC查询系统所修改的信息?可以采用如下方式:
print server.find_systems_since(mtime)
注意:不同的Cobbler版本,这个函数并不一样,我的版本为2.6,因此我使用的是如下方法:
print server.get_systems_since(mtime)