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界面了.
好了,有了這些,相信各位客官也能搞個平台玩玩了.


TAG:運維講堂 |