OpenStack基礎(chǔ)設(shè)施團(tuán)隊(duì)負(fù)責(zé)管理開發(fā)在OpenStack項(xiàng)目當(dāng)中每天所需要面對(duì)的常用服務(wù),具體包括代碼審核與持續(xù)集成系統(tǒng)、維基、IRC聊天機(jī)器人以及郵件列表等等。
我們也擁有屬于自己的開源項(xiàng)目。我們?cè)诨A(chǔ)設(shè)施當(dāng)中所使用的全部代碼及配置方案都可通過(guò)一系列公共代碼庫(kù)獲得,而且全部相關(guān)說(shuō)明文檔也皆向大家開放。這種方式與多數(shù)其它開源項(xiàng)目不同,它們要么依賴于由單一代碼托管服務(wù)所提供的專用性資源——例如SourceForge或者GitHub,要么是由某些企業(yè)中的IT人員負(fù)責(zé)完成基礎(chǔ)設(shè)施管理——例如Ubuntu項(xiàng)目。
選擇像OpenStack項(xiàng)目這樣構(gòu)建一套由社區(qū)負(fù)責(zé)維護(hù)的開源基礎(chǔ)設(shè)施擁有諸多優(yōu)勢(shì),其中包括:
允許企業(yè)及個(gè)人參與到OpenStack基礎(chǔ)設(shè)施的發(fā)展規(guī)劃當(dāng)中,例如為開發(fā)團(tuán)隊(duì)提供直接的貢獻(xiàn)資源以及反饋意見。
允許開發(fā)人員以更為主動(dòng)的方式參與項(xiàng)目發(fā)展,而并非坐等新功能的出現(xiàn)。他們可以提供貢獻(xiàn)資源,從而加快項(xiàng)目成果的交付速度。
鼓勵(lì)團(tuán)隊(duì)中采取更理想的實(shí)踐舉措,因?yàn)槲覀兯_發(fā)的成果并非單純服務(wù)于自身、同時(shí)也面向受眾乃至最終的下游受眾。
能夠接收貢獻(xiàn)成果,從而改善現(xiàn)有基礎(chǔ)設(shè)施并支持更多來(lái)自下游受眾的選項(xiàng)及方案。
我們這個(gè)團(tuán)隊(duì)致力于倡導(dǎo)開源機(jī)制,而且堅(jiān)信盡最大努力保持基礎(chǔ)設(shè)施的開源屬性會(huì)是個(gè)正確的選擇。
當(dāng)然,這種方式并不僅僅適用于開源項(xiàng)目。商業(yè)企業(yè)也能夠通過(guò)這種將基礎(chǔ)設(shè)施向其它機(jī)構(gòu)開放的方式獲得切實(shí)收益。想象一下,大家可以接受來(lái)自各方的代碼貢獻(xiàn)來(lái)調(diào)整基礎(chǔ)設(shè)施請(qǐng)求的優(yōu)先級(jí)排序,如此一來(lái)他們就能夠親自動(dòng)手而非坐等運(yùn)營(yíng)團(tuán)隊(duì)緩慢地拿出未必適合其需要的解決方案,這對(duì)基礎(chǔ)設(shè)施的發(fā)展顯然是種巨大的推動(dòng)。除此之外,如果開發(fā)團(tuán)隊(duì)能夠針對(duì)實(shí)際需求給出真正適合的配置方案,那么復(fù)制生產(chǎn)環(huán)境將變得非常輕松。再有,外來(lái)貢獻(xiàn)者能夠提供良好的說(shuō)明文檔,這樣剛剛加入運(yùn)營(yíng)團(tuán)隊(duì)的新成員就能快速熟悉整個(gè)體系長(zhǎng)久以來(lái)所遵循的最佳實(shí)踐機(jī)制。
在過(guò)去幾年的實(shí)踐歷程當(dāng)中,我們一直使用Puppet來(lái)創(chuàng)建令我們深深為之自豪的開源基礎(chǔ)設(shè)施體系。總結(jié)來(lái)講,我們可以將其劃分為三個(gè)主要步驟:
1.籌備管理政策并進(jìn)行代碼分離
2.籌備配置管理系統(tǒng)
3.籌備文檔與共享機(jī)制
籌備管理政策并進(jìn)行代碼分離
OpenStack基礎(chǔ)設(shè)施團(tuán)隊(duì)制定了一套管理政策,旨在確保基礎(chǔ)設(shè)施當(dāng)中只使用開源產(chǎn)品。雖然這種要求對(duì)于很多組織機(jī)構(gòu)而言有些不切實(shí)際,但卻切實(shí)幫助我們共享自己所使用的各類組件,同時(shí)保證下游項(xiàng)目能夠在全面引用我們的基礎(chǔ)設(shè)施時(shí)、無(wú)需擔(dān)憂許可費(fèi)用或者任何“黑盒”組件可能帶來(lái)的額外支出。
雖然并不適用于所有組織機(jī)構(gòu),但這種方式能夠?qū)A(chǔ)設(shè)施進(jìn)行明確劃分,幫助管理者了解哪些組件能夠自由共享及引用、而哪些不能。如此一來(lái),大家將不用再擔(dān)心自己會(huì)在不自知的情況下共享了專有配置文件,而其它部門也能由此了解到使用這套基礎(chǔ)設(shè)施方案的相關(guān)成本。
現(xiàn)在我們已經(jīng)明確了哪些屬于專有組件而哪些能夠自由共享,接下來(lái)要做的就是通過(guò)合適的決策對(duì)代碼進(jìn)行分享。如果相對(duì)內(nèi)容屬于開源或者大家確信自己的許可機(jī)制允許在企業(yè)內(nèi)部對(duì)其配置文件及部署細(xì)節(jié)信息進(jìn)行共享,那么請(qǐng)放心大膽地去做。
最后,整理好流程說(shuō)明以降低下一次同類工作的執(zhí)行難度(或者面向潛在的下游受眾),同時(shí)為全部代碼及配置文件配備一套由您的團(tuán)隊(duì)創(chuàng)建的許可協(xié)議。沒(méi)錯(cuò),連配置文件也要包含在內(nèi)。
籌備配置管理系統(tǒng)
這是大家向更為開放的基礎(chǔ)設(shè)施方案過(guò)渡時(shí)所必需的技術(shù)要素。在構(gòu)建專有型運(yùn)營(yíng)團(tuán)隊(duì)時(shí),我們必須精簡(jiǎn)執(zhí)行流程、采取最佳實(shí)踐并將所有配置機(jī)制匯總成一套綜合性配置庫(kù)。作為一個(gè)開源項(xiàng)目,OpenStack基礎(chǔ)設(shè)施團(tuán)隊(duì)有時(shí)候也不得不采取這樣的執(zhí)行思路,不過(guò)我們一直在努力通過(guò)自己的方式實(shí)現(xiàn)這類效果、從而吸引更多下游受眾的加入。
使用現(xiàn)有開源模塊
我們沒(méi)有為Puppet編寫一套新的Apache模塊。我們可以直接將公開模塊導(dǎo)入,并根據(jù)實(shí)際功能需要向上游供應(yīng)方提供要求。
輕松下載開源模塊并直接對(duì)其進(jìn)行修改的方式無(wú)疑極具吸引力,其本質(zhì)上相當(dāng)于創(chuàng)建出一套專門在內(nèi)部環(huán)境下使用的fork。不過(guò)這也會(huì)給維護(hù)團(tuán)隊(duì)帶來(lái)學(xué)生的負(fù)擔(dān),因?yàn)槲覀儗o(wú)法再輕松升級(jí)到最新開源版本,同時(shí)也會(huì)因此而被迫采取對(duì)模塊內(nèi)的定制變量進(jìn)行定義等糟糕的實(shí)踐方式。事實(shí)上,我們的團(tuán)隊(duì)想當(dāng)初也嘗試過(guò)這樣的作法,并最終導(dǎo)致不得不利用一系列項(xiàng)目來(lái)對(duì)配置組合進(jìn)行整理。當(dāng)時(shí)我們編寫出一套規(guī)范,其中闡述了我們所采取的模塊分享與標(biāo)準(zhǔn)化調(diào)整步驟,包括我們用于為所有文件保存歷史記錄并將它們劃歸至不同獨(dú)立模塊時(shí)所使用的一部分git命令。
更進(jìn)一步,如果要構(gòu)建可供其他用戶使用的模塊、我們需要自行負(fù)責(zé)編寫,同時(shí)確保將這些經(jīng)過(guò)修改的部分從原始模塊中分離出來(lái)。大家部署在服務(wù)器上的這些本地修改成果能夠存在于特定模塊當(dāng)中,它們針對(duì)組織機(jī)構(gòu)的實(shí)際需求作出了針對(duì)性調(diào)整。我們自己的模塊被命名為openstack_project。
將系統(tǒng)配置與項(xiàng)目配置加以拆分
在項(xiàng)目發(fā)展早期,我們擁有一套綜合性配置方案。在此之后,我們發(fā)現(xiàn)如果下游受眾希望將我們的基礎(chǔ)設(shè)施方案引入他們自己的項(xiàng)目,那么他們必須同時(shí)使用這些配置機(jī)制才能使其生效——但與此同時(shí),他們更希望能夠自行定義項(xiàng)目配置。
我們需要為此制定計(jì)劃,所以我們的團(tuán)隊(duì)首次編寫了一套規(guī)范,其中概述了需要將哪些組件拆分出來(lái)、又需要通過(guò)怎樣的方式讓整套體系以及變更內(nèi)容切實(shí)生效。與服務(wù)相關(guān)且需要運(yùn)行在我們基礎(chǔ)設(shè)施當(dāng)中的一切(包括代碼審查系統(tǒng)、測(cè)試服務(wù)器等等)都被配置在一套庫(kù)當(dāng)中,這樣我們就能利用它來(lái)容納OpenStack項(xiàng)目列表、自定義IRC頻道集以及實(shí)際運(yùn)行在我們Jenkins服務(wù)器上的各項(xiàng)任務(wù)等。
時(shí)至今日,我們將其匯總成了system-config與project-config,二者獨(dú)立存在而又并行不悖。
分離敏感數(shù)據(jù)
現(xiàn)在,我們作為社區(qū)擁有充分的自由權(quán),但卻仍然需要保持整套OpenStack開發(fā)平臺(tái)的完整性,這意味著我們也擁有自己的一點(diǎn)小秘密。具體而言,我們需要將私有SSL證書與一系列不同類型的驗(yàn)證憑證保存在安全的所在,且只允許經(jīng)過(guò)篩選的少數(shù)管理員對(duì)其進(jìn)行訪問(wèn)。在我們的團(tuán)隊(duì)中,我們利用Puppet的Hiera工具存儲(chǔ)上述值。我們將其納入私有版本控制范疇,只允許root管理員進(jìn)行訪問(wèn)。此外,我們?cè)谡f(shuō)明文檔中明確提到我們?nèi)绾问褂眠@些數(shù)值以及其中涉及哪些變量,如此一來(lái)每位用戶都能夠使用我們的基礎(chǔ)設(shè)施,并根據(jù)實(shí)際需要復(fù)制其中的一部分?jǐn)?shù)據(jù)。
在基礎(chǔ)設(shè)施內(nèi)提供一個(gè)窗口
一部分企業(yè)允許開發(fā)人員以受限方式訪問(wèn)其生產(chǎn)服務(wù)器,但我們則選擇使用一款名為PuppetBoard的工具讓開發(fā)人員了解我們的服務(wù)器到底在搞些什么。有了這款工具,任何人都訪問(wèn)時(shí)都能夠?yàn)g覽到一套Web UI,其中顯示出與服務(wù)器運(yùn)行相關(guān)的細(xì)節(jié)信息以及某項(xiàng)特殊改動(dòng)是否已經(jīng)被接受或成功實(shí)現(xiàn)。這相當(dāng)于為貢獻(xiàn)者們提供了一個(gè)窗口,他們能夠借此觀察工作進(jìn)展并獨(dú)自執(zhí)行與變更相關(guān)的操作。某項(xiàng)變更是否已經(jīng)被接受?它是否帶來(lái)了某些錯(cuò)誤?檢查PuppetBoard,一切答案都將揭曉。如果大家感興趣,可以點(diǎn)擊此處查看我們的公開實(shí)例。
說(shuō)明文檔與共享機(jī)制
現(xiàn)在大家已經(jīng)擁有了一套基礎(chǔ)設(shè)施方案,各位肯定打算充滿自豪地將其展示在父母面前,并向所在組織機(jī)構(gòu)提交一份說(shuō)明文檔與共享資料。
請(qǐng)確保這份文檔包含以下內(nèi)容:
在哪里尋找代碼與配置內(nèi)容。
如何提交變更(也包括代碼審查、pull請(qǐng)求、漏洞報(bào)告以及ticket等)。
如何在副本環(huán)境下進(jìn)行變更測(cè)試(可點(diǎn)擊此處查看相關(guān)示例)。
在查看代碼及配置時(shí),要保證任何引導(dǎo)及對(duì)接信息不可直接顯示出來(lái)。其中也包括任何需要運(yùn)營(yíng)團(tuán)隊(duì)以手動(dòng)方式執(zhí)行的操作。
最后,打開大門、迎接開放!將基礎(chǔ)設(shè)施與我們所在的組織機(jī)構(gòu)共享,并了解更為強(qiáng)大的開發(fā)團(tuán)隊(duì)與掌握有更多信息的組織機(jī)構(gòu)如何利用這種明確的窗口機(jī)制運(yùn)用我們的基礎(chǔ)設(shè)施。
OpenStack之外的開放實(shí)踐
除了OpenStack,還有其它一些開源項(xiàng)目以整體或者部分形式對(duì)其基礎(chǔ)設(shè)施進(jìn)行開源。大家可以通過(guò)以下鏈接了解它們的運(yùn)作機(jī)制并瀏覽其開放配置:
Debian
Fedora
Jenkins
Mozilla