Cobbler与Django结合

现在大部分服务都提供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界面了.

好了,有了这些,相信各位客官也能搞个平台玩玩了.

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180702G0FX2F00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券