張梁+羅宇
摘?要:本文致力于為openstack設(shè)計一個可以設(shè)定虛擬機實例定時運行功能的插件。該插件是基于openstack的horizon組件的功能拓展,用戶可以像以往使用horizon的dashboard的功能一樣去使用它。用戶通過這個組件可以設(shè)定每一天虛擬機運行的起止時間,以及每周需要哪幾天運行的周期循環(huán)時間。整個插件的設(shè)計完全遵循Django的設(shè)計原則。
關(guān)鍵詞:openstack;虛擬機定時任務(wù);horizon?dashboard;Django
Design?and?implement?the?instance?timing?running?based?on?openstack
Zhang?Liang1,?Luo?Yu2
(1.?School?of?Computer,Nation?University?of?Defense?Technology,Changsha?410073,China;2.?School?of?Computer,Nation?University?of?Defense?Technology,Changsha?410073,China)
Abstract:This?paper?contribute?to?design?a?plugin?for?openstack?to?implement?the?function?of?setting?the?time?of?some?instance's?running.The?plugin?is?designed?based?on?horizon?dashboard,the?users?can?operate?it?the?same?as?them?use?dashboard.User?not?only?could?set?the?time?of?start?and?suspend?of?some?instance?easily?by?it,but?also?choose?day?of?the?week?as?he?want.The?designing?model?follow?the?principle?of?Django?complete.
Key?words:?openstack;setting?instance?timing?running;horizon?dashboard;Django
0引言
由于云計算技術(shù)所具有的資源調(diào)配靈活,節(jié)約硬件、人員、管理成本,對于計算資源的高利用率,數(shù)據(jù)可靠性高,平臺管理的高度集約性等眾多突出優(yōu)勢,如今不僅僅是提供公有云服務(wù)的大型云服務(wù)企業(yè),還是搭建私有云供自身使用的政企科研教學單位都對其趨之如騖。
而openstack則是為企事業(yè)單位提供云平臺的一個絕佳選擇,這主要得益于openstack是完全開源的項目,有諸如RedHat、HP、IBM、Rackspace、Citrix、Intel、Cisco等眾多科技領(lǐng)頭企業(yè)的鼎力支持,在技術(shù)得到保障的同時又不必擔心代碼會被某個獨家企業(yè)所壟斷而陷入付費的桎梏。
openstack簡介。整個openstack的架構(gòu)是一個典型的分布結(jié)構(gòu)。openstack主要由Nova,glance,Swift,keystone,horizon,cinder,?neutron?,heat等組件構(gòu)成。其中Nova負責對所建虛擬機整個生命周期的管理例如從虛擬機創(chuàng)建,虛擬機的調(diào)度分配,控制虛擬機的運行,快照的生成,卷的管理等,主要起到了云控制器的作用,本課題也要與Nova提供的API服務(wù)打交道。glance組件則是對于鏡像存儲的管理。Swift提供對象存儲系統(tǒng)。cinder提供塊存儲。keystone為云主機Nova,鏡像管理glance,對象存儲Swift和界面horizon提供認證服務(wù),主要工作內(nèi)容包括對用戶信息管理(包括用戶,租戶基本信息),項目project的管理。登陸認證,用戶權(quán)限管理。本課題的開發(fā)內(nèi)容就涉及到用戶身份認證以及虛擬機認證令牌的申請獲取。horizon則是則是為終端用戶(云平臺管理員和普通用戶)提供使用云平臺的界面。本課題的交互界面開發(fā)也是完全基于horizon組件的。neutron則是為虛擬機分配網(wǎng)絡(luò)。heat則是提供對于虛擬機實例上的軟件的簡單的部署、配置管理功能。
普通用戶對于openstack的功能使用一般都會通過horizon組件提供的dashboard(如圖1)界面去獲得,dashboard就充當了openstack提供給普通用戶的UI。從dashboard中可以找到一些對于openstack的基本操作,如創(chuàng)建虛擬機,編輯虛擬機,啟動、停止虛擬機,給虛擬機做快照等等,但是缺乏定時運行虛擬機的功能。在虛擬機的實際應(yīng)用中,具體某個實例的運行時段是跟使用虛擬機人員的工作作息時間或者虛擬機的使用計費時段密切相關(guān),例如說某人早上8點開始上班需要啟動若干虛擬機,等到下午6點下班后對其的使用就結(jié)束了,但是第二天還得接著當天的工作繼續(xù)進行——也就是說當天的工作現(xiàn)場還得繼續(xù)保留以待第二天繼續(xù)使用,事實上這里還有另外一個優(yōu)點,由于虛擬機啟動時間受制于本地磁盤性能(如果是遠程啟動更要受制于帶寬限制),如果實例較大往往需要較長的等待時間,所以使用者可以提前設(shè)置虛擬機啟動,使用者進入工作現(xiàn)場時候就直接能夠使用,這樣是用戶體驗得到明顯改善。云平臺下的某些租用計費方式一般是按量、按時計費——也就說是按照使用虛擬資源的多少以及占用計算存儲資源時長來計費的。企業(yè)個人在某些時段可能就不需要使用虛擬機,這個時候選擇將其停止,運行實例退出內(nèi)存,運行現(xiàn)場保留到磁盤中騰出了運行資源也退出了計費狀態(tài)。
圖(1)
從以上列舉分析的案例可以看出,為openstack設(shè)計開發(fā)虛擬機定時任務(wù)功能很有實際意義,本文就是著力詳細解析決基于openstack虛擬機定時任務(wù)的完整方案。
1軟件需求分析
1.1人機交互需求
openstack本身的交互方式的架構(gòu)為典型的B/S架構(gòu)。用戶通過瀏覽器訪問horizon組件內(nèi)置的web服務(wù)器,web服務(wù)器提供的一個訪問界面被稱作dashboard,dashboard提供了各種對于openstack的操作,這些操作大致分類為:對于鏡像的操作,對于虛擬機的操作,對于卷的操作,網(wǎng)絡(luò)的設(shè)置,域及用戶權(quán)限的設(shè)置。顯然,為了交互的一致性、跟便捷性,新增的“虛擬機定時任務(wù)”功能應(yīng)該放在與對虛擬機操作的按鈕列表欄(如圖2所示)。為了在點擊設(shè)置定時任務(wù)按鈕后,將會彈出一個時間設(shè)置頁面(如圖3所示),讓用戶通過點擊下拉列表去設(shè)置啟、停的時間。對于“星期幾”運行的設(shè)置,由于星期是全排列的復選組合方式,所以設(shè)置選取“星期幾”的時候則使用復選框。為了保持風格的一致性,使用的對話框、下拉列表與復選框均與dashboard使用的一致
圖(2)
圖(3)
1.2數(shù)據(jù)傳輸?shù)男枨?/p>
web前端的用戶數(shù)據(jù)主要有四類:(1)用戶ID信息以及所屬于工程及域。(2)虛擬機實例的信息,主要包括實例ID號,空間大小,系統(tǒng)類型等。(3)用戶輸入的啟動時間信息,主要包括啟動以及停止實例的時(24小時制)、分,以及星期一至星期天復選項等信息。(4)確認信息的數(shù)據(jù)傳輸,按下確認按鈕后的信息的的傳輸。
1.3數(shù)據(jù)存儲的需求
web前端的用戶數(shù)據(jù)傳輸?shù)椒?wù)器后臺之后,一些重要的數(shù)據(jù)如登陸用戶信息、使用虛擬機實例的信息、用戶定時信息、用戶操作日志、組件出錯信息都要被存儲。
1.4業(yè)務(wù)功能需求
本組件要完成的功能主要有:(1)虛擬機運行任務(wù)的定時。(2)定時任務(wù)到點后對于啟動或者停止虛擬機腳本的觸發(fā)。(3)啟動、停止虛擬機腳本。
2技術(shù)實現(xiàn)方案
從上一部分需求分析的結(jié)論我們可以將整個軟件的分為“人機交互模塊”跟“任務(wù)處理模塊”,“人機交互模塊”主要提供人機交互UI界面跟界面上數(shù)據(jù)的傳遞,而“任務(wù)處理模塊”則是接收處理從web前端傳遞來的數(shù)據(jù),完成業(yè)務(wù)邏輯。
2.1人機交互模塊的技術(shù)實現(xiàn)
openstack是由horizon組件來提供一個命名為dashboard的基于網(wǎng)頁交互界面。整個dashboard是在Django框架下設(shè)計開發(fā)的,很顯然新增的業(yè)務(wù)功能必須在同樣的框架下開發(fā)。Django本身推崇“MTC模式”,在所謂“MTC模式”中M(model)代表數(shù)據(jù)據(jù)訪問部分,通過Django的數(shù)據(jù)庫層處理?;T(template)選擇數(shù)據(jù)并決定怎樣呈現(xiàn)的部分,通過視圖和模板來處理?;C(control)控制部分通過Django框架本身的URL配置和對Python方法的調(diào)用來處理?。其中“C”是Django框架本身提供的機制來處理,而Django的重點就在于模型,模板和視圖。
2.1.1設(shè)置頁面的按鈕設(shè)計
dashboard本身就是在MTC模式下高度面向?qū)ο蠡O(shè)計的,且采取自頂向下的設(shè)計風格。從繼承關(guān)系看分為:Dashboard?→?PanelGroup?→?Panel這樣三層關(guān)系。Horizon中現(xiàn)有的dashboard有4個,分別是project?——普通用戶登陸后看到的項目面板;admin?——管理登陸后可見,左側(cè)的管理員面板;settings?——右上角的設(shè)置面板,里面可設(shè)置語言,時區(qū),更改密碼;router(配置文件中將profile_support打開可見),ciso?nexus?1000v的管理面板。每一個dashboard都是django中的一個app,django中的app可以理解成對業(yè)務(wù)邏輯模塊化的一種手段,里面可以包含自己獨有的url設(shè)定,模板,和業(yè)務(wù)邏輯代碼。每個dashboard下定義了一系列的PanelGroup,虛擬機管理對應(yīng)到界面上就是一個PanelGroup(Manage?Compute),?而這個PanelGroup里面有一系列的子panel(例如:Overview,?Instances,?Volumes…)。而我們要新增的虛擬機定時任務(wù)的啟動按鈕就是要放在這個Instances這個子panel上面。如圖4所示,在instances這個panel上面就出現(xiàn)了諸如解除浮動IP的綁定、編輯云主機、編輯安全組、控制臺、查看日志、停止云主機等選項,設(shè)置虛擬機定時任務(wù)時間按鈕置于最下方。要往panel上添加按鈕必須在horizon/openstack_dashboard/dashboards/project/instances目錄下的tables.py文件里添加一個類,我們命名它為SetTime類,由于這個按鈕是一個鏈接性質(zhì)的,這個類必須從tables.LinkAction繼承,SetTime類必須具有指代名(name),詳細名(verbose_name,用于顯示時候的名稱),以及url(用于標示這個按鈕的位置)三個必須的私有屬性。對于name這個屬性我們可以賦予settime(可閱讀性好)。verbose_name賦予Set?Instance?Lanuch?Time,這個名稱將會顯示在instance的panel上。URL則被賦予“horizon:project:instances:settime”。還有一個鏈接指示函數(shù),通常命名為get_link_url(),這個函數(shù)是告訴Django去尋找并解析這個url的路徑值,作用就是找到“Set?Instance?Lanuch?Time”按鈕指向的頁面。還必須在同文件中一個Meta類中注冊SetTime這個按鈕,將其寫進row_actions這個元組當中去,這樣這個按鈕的圖標才能被顯示出。
2.1.2設(shè)置對話框的設(shè)計
接著要設(shè)計出按鈕觸發(fā)的設(shè)計時間的對話框。對話框必須有起止的時間,星期數(shù),確定的按鈕。如圖6所示。Django遵循MTC設(shè)計模式,視圖的內(nèi)容(被稱為context)均由模板來修飾。對話框就是一個典型的視圖,要設(shè)計這個視圖首先必須有一個視圖類(這里我們命名為:SetTimeView),這個類當中有幾個必須的私有屬性,一個唄命名為from_class,它必須去繼承一個設(shè)計好的視圖。另一個屬性則是模板名字template_name,這個私有屬性獲得模板的路徑。另外還有個被命名為success_url的屬性,它的作用當你點擊上文提到的“確定”按鈕時候服務(wù)器就會去根據(jù)success_url的值去尋找視圖。除了以上三個必須的私有屬性外還必須有一個獲取模板所修飾的對象——上下文——context的函數(shù),這個函數(shù)主要作用就是獲取模板修飾的上下文。
接下來就是設(shè)計下拉條(設(shè)置時間),復選框(設(shè)計星期)跟確認按鈕這些UI組件。首先必須在找到horizon/openstack_dashboard/dashboards/project/instances這個文件夾,進入forms.py文件,下拉列表選用ChoiceField插件,只需在ChoiceField屬性內(nèi)填充一個label為欲設(shè)計的下拉列表的標題名稱,以及窗口名字的設(shè)置class為‘set?time即可,其他可以使用默認參數(shù)。例如設(shè)計哪個小時啟動的下拉列表,LaunchHour?=?forms.?ChoiceField(label=_("hour"),widget=fields.SelectWidget(attrs={'class'=:'set?time'},data_attrs=('size','display-name'),transform=_image_choice_title))。同法設(shè)置其他時間選取下拉列表。再來設(shè)計星期幾的復選框,復選框使用MultipleChoiceField插件
,在其choice參數(shù)賦予子選項所組成的元組,如choices=list_choices,?list_choices?=?(('1',?Monday),('2','Tuesday'),('3','Wednesday'),('4','Thursday'),('5','Friday'),('6','Saturday')?,('7','Sunday'))。用request.REQUEST.getlist函數(shù)去取的選中的值。最后還要設(shè)計一個HTML文件。由于horizon高度模塊化的設(shè)計,視圖函數(shù)與HTML文件是分離的,這樣視圖函數(shù)就會比較靈活能隨時替換以及修改,這里需要在HTML文件設(shè)計一下任務(wù)時間彈出設(shè)置框網(wǎng)頁的網(wǎng)頁標題,顯示方式,以及一個“確認”按鈕即可。到此整個組件的網(wǎng)頁的UI部分設(shè)計完畢。
2.2數(shù)據(jù)傳輸模式
在這里要處理的數(shù)據(jù)傳輸主要是前段的用戶數(shù)據(jù)傳輸?shù)胶蠖颂幚?。當前段用戶?shù)據(jù)設(shè)定完成后,按下“確定”按鈕會觸發(fā)一個post函數(shù)方法將數(shù)據(jù)打包經(jīng)由HTTP協(xié)議發(fā)送至后端,后端的get方法會得到這些數(shù)據(jù)并交由相應(yīng)的模塊處理
2.3后臺業(yè)務(wù)邏輯處理
圖(4)
后臺的業(yè)務(wù)流程如圖4所示。用戶前端網(wǎng)頁的數(shù)據(jù)傳給定時器,定時器設(shè)置自身的數(shù)據(jù)設(shè)置計時,時間到點后去觸發(fā)啟動/停止腳本,與此同時數(shù)據(jù)庫還會將用戶的數(shù)據(jù)(用戶ID,每個ID下對應(yīng)的實例,定時信息)以及操作的行為記錄下來。
2.3.1定時器的設(shè)計說
openstack目前只能安裝在Linux內(nèi)核系列的系統(tǒng)上,在常見的Linux內(nèi)核系統(tǒng)(如Ubuntu,RedHat,centos,federal等)一般都有一個非常實用的定時組件叫crontab。crontab可以較為方便、穩(wěn)定、準確的實現(xiàn)定時任務(wù)執(zhí)行。使用crontab分為兩步:1、只需將諸如“*?*?*?*?*?something.py”的文本寫入一個文件,其中五個*符號順序依次代表分鐘(0-59)、小時(0-23)、日期(1-31)、月份(1-12)、星期幾(0-6),最后面的something.py文件代表要去執(zhí)行的命令或者程序(可以使多條命令或者程序),當然對時間的設(shè)置其實有相當大的靈活性,比如可以進行幾個小時或者分鐘的間隔設(shè)置,可以指定某段時間執(zhí)行,本文在此就不詳細敘述。2、執(zhí)行crontab?something.py文件定時任務(wù)即可生效。這里還有一個問題,就是這個crontab文件由誰,如何去產(chǎn)生,其實完全可以把這個任務(wù)交給之前的SetTimeForm類里去編碼執(zhí)行,這個類的作用原本是設(shè)計彈出設(shè)置時間的頁面,在這個類里有個handle()函數(shù),這個函數(shù)起到兩個非常重要的作用,一是向其他文件構(gòu)共享出用戶設(shè)置的時間變量,起到通信作用。二是向需要生成crontab文件注入啟動/停止的時間周期以及到時間點需要執(zhí)行的腳本。
2.3.2啟動/停止腳本
現(xiàn)在來現(xiàn)對于虛擬機實例的啟動/停止(這里的停止是將其整個虛擬機運行現(xiàn)場保存至硬盤,在虛擬機監(jiān)視器看來并沒有真的停止它),要自己通過代碼去控制一個虛擬機的啟動/停止有兩種途徑,一種是通過openstack官方給出API函數(shù)接口去實現(xiàn),使用的方法是:首先必須使用你的證書來認證來獲取authentication?token。證書包含了用戶名、密碼和tenant(項目)。而這個證書則可以通過curl+租戶名+用戶名+密碼+本機ip地址去獲得(具體格式參考openstack官網(wǎng))。token允許你不需要再次認證就能和其他的service?endpoints交互。Tokens通常只有24小時的生命期,當token過期后,你將會收到一個401(未被授權(quán)的)響應(yīng),這時候必須重新請求一個token。利用這個token就可以去使用openstack的服務(wù),停止虛擬機的命令如下:nova?suspend?--flavor?2?--key_name?oskey?--image?ea3ffba1-065e-483f-bfe2-c84184ee76be(這串字符為image的id)。第二種方法是通過novaclient提供的命令行工具去執(zhí)行命令。具體做法如下:從openstack本身提供的novaclient.v1_1模塊import一個client包創(chuàng)建并且初始化一個nt=client.Client("用戶名","密碼","站點IP地址"),調(diào)用nt的servers的屬性方法nt.servers.suspend("虛擬機實例的ID")即可。同上理,執(zhí)行這個命令暫時借用超級管理員身份。
這里要注意一個問題,對于虛擬機運行時間的設(shè)置的用戶的身份一般都是普通用戶,而普通用戶很可能(取決于該用戶所屬于租戶所賦予的角色權(quán)利,但是普通用戶往往權(quán)限較低)是不能直接去使用某些服務(wù),為了統(tǒng)一、簡潔的解決這個問題,在啟動/停止腳本中暫時借用admin身份去使用某些服務(wù)
3總結(jié)
本文致力于為openstack設(shè)計一個虛擬機定時任務(wù)組件,本組件基于horizon項目,完全遵循Django的設(shè)計開發(fā)模式,能輕易滿足具備openstack使用經(jīng)驗用戶的習慣。設(shè)計完畢后通過在自己實驗室openstack的部署環(huán)境下試用測試,運行穩(wěn)定未發(fā)現(xiàn)BUG。