现在大部分服务都提供api,方便将其与其台平台整合起来,cobbler也提供了其api,让我们运维人员可以通过web界面来管理它.
这里,我仅提供大概的思路和核心的代码块.
我们将其服务器添至CMDB中,再通过web界面,让其安装。
添加主机
查看服务器列表(因为我还没安装系统,所以状态为x)
在这里我们点击”装机”,便跳到”安装系统”页面
再点击”安装系统”
再查看cobbler server端
好了,我们启动这台mac为52:54:00:67:ae:42看它能否按照指定的系统安装了.
代码摘录:
安装系统页面install_system.html
这是一个点击“安装系统”连接,这里需要提供节点uuid
```shell
ahref=""data-nodeid="{{node.uuid}}"class="btn btn-xs btn-primary"data-toggle="modal"
onClick="install_os(this)">安装系统>
ajax代码
script>
functioninstall_os(obj) {
var_this=$(obj);
varhostname_id=_this.attr('data-nodeid')
$.ajax({
cache:false,
type:"POST",
url:"/auto/install_node/",
dataType:'text',
data: ({
"hostname_id":hostname_id,
"csrfmiddlewaretoken":"{{csrf_token}}"
}),
async:true,
error:function(request) {//设置表单提交出错
alert("表单提交出错,请稍候再试");
},
success:function(msg) {
$("#salt_cmd_run").html(msg)
}
});
return false;
}
script>
```
通过这段ajax代码便会将hostname_id以post形式发送到后端/auto/install_node的view处(这里是在urls.py中设置,对应的函数为install_os).
```shell
views.py
fromcobbler_apiimportCobblerAPI
frommysite.settingsimportcobbler_url,cobbler_user, cobbler_pwd, cobbler_gateway, cobbler_subnet
definstall_os(request):
"""安装系统"""
content = {}
ifrequest.method=='POST':
node_hostname = request.POST
hostname_id =node_hostname.getlist("hostname_id")
foridinhostname_id:
host_list = Host.objects.get(uuid=str(id))
try:
system = CobblerAPI(cobbler_url,cobbler_user, cobbler_pwd)
except:
content["success"] =False
content["result"] =u"请确保cobbler server服务正常及帐号密码正确!"
returnrender_to_response('autoinstall/auto_setup_system_error.html',locals(),
context_instance=RequestContext(request))
system_name =host_list.node_name+"-"+host_list.eth1
mac = host_list.mac.replace("-",":")
ret = system.add_system(host_list.node_name,host_list.eth1, mac, host_list.system,
cobbler_gateway,
cobbler_subnet,
system_name)
ifret["result"]:
host_list.status =2
host_list.save()
content["success"] =True
content["result"] =u"等待服务器加电安装..."
returnrender_to_response('autoinstall/auto_setup_system_error.html',locals(),context_instance=RequestContext(request))
else:
content["success"] =False
content["result"] =u"定制安装失败,请确保cobbler server服务正常!"
host_list.status =
host_list.save()
returnrender_to_response('autoinstall/auto_setup_system_error.html',locals(),context_instance=RequestContext(request))
returnrender_to_response('autoinstall/install_list.html', content,context_instance=RequestContext(request))
```
这里需要调用cobbler_api.py
```shell
importxmlrpclib
importos
classCobblerAPI(object):
def__init__(self, url, user,password):
self.remote= xmlrpclib.Server(url)
self.token=self.remote.login(user, password)
self.ret= {
"result":True,
"comment": [],
}
defadd_system(self, hostname, ip_add, mac_add, profile, gateway,subnet,system_name):
'''
Add Cobbler System Infomation
'''
system_id =self.remote.new_system(self.token)
self.remote.modify_system(system_id,"name", system_name,self.token)
self.remote.modify_system(system_id,"hostname", hostname,self.token)
self.remote.modify_system(system_id,"gateway", gateway,self.token)
self.remote.modify_system(system_id,'modify_interface', {
"macaddress-eth0": mac_add,
"ipaddress-eth0": ip_add,
"subnet-eth0": subnet,
"static-eth0":1,
"name-servers-eth0":"202.96.209.5",
},self.token)
self.remote.modify_system(system_id,"profile", profile,self.token)
self.remote.save_system(system_id,self.token)
try:
self.remote.sync(self.token)
os.system("cobbler system edit --name=%s--gateway=%s"%(hostname, gateway))
exceptExceptionase:
self.ret['result'] =False
self.ret['comment'].append(str(e))
returnself.ret
```
需要在settings.py中设置些变量
```shell
cobbler_url="http://192.168.214.50/cobbler_api"
cobbler_user ="cobbler"
cobbler_pwd ="cobbler"
cobbler_subnet ="255.255.255.0"
cobbler_gateway ="192.168.214.254"
```
将cobbler server关掉或者用户名密码填写错误.
前端错误提示
后续扩展:
问题1.当提示可以安装后,系统状态status设置为2 ,表示在安装中…,但没有做到当系统真正安装好后,如何提示系统安装成功.
对与此问题,我们可以写个后台程序,每隔30分钟,去读取status为2的ip,去尝试telnet 22,如果通了,将其status改为1.
因为,我在models的Host status的值定义为如下:
u"""
0 未安装系统
1 已安装系统
2 正在安装中
3 报废
"""
所以,我们需要将其status值动态改变。
问题2.还有个问题,就是cobbler server上配置了system定义安装系统信息,如果下次这台机器以pxe启动安装的话,还会安照定义的信息重装.可能,这不是我想要的,我需要将其cobbler server端删除掉,如手工删除cobbler system remove --name=”opdevos-192.168.214.45”,当然我们也可以在前面那个后台程序再扩展下,当状态status改为1时,再将其cobbler server端的system删除掉,并且为了保险,可以设置每天零点,去主动删除cobbler server上所有的system。
对与我们这边的环境,这个动作我们是可以接受的,各位可以根据自己公司的情况来决定,如何操作.
问题3.删除cobber server的system程序都是跑在后台的,不够直观,我们也可以将其通过api,获取其cobbler server上的system,也可通过web界面,去主动删除掉.或者用户主动去创建定制system.这是可以做到的。
问题4.对与定制好后,都需要运维人员在机房去加电开机,也许这不是你想要的,你还可以通过ipmi命令行形式去开机(加电还是需要些运维同学帮忙的),也可通过python去调用ipmi(不管是命令,还是包)都可以。有了这个,就可以开发web界面了.
好了,有了这些,相信各位客官也能搞个平台玩玩了.
领取专属 10元无门槛券
私享最新 技术干货