天天看點

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

本節書摘來自華章計算機《storm分布式實時計算模式》一書中的第2章,第2.6節,作者:(美)p. taylor goetz brian o’neill 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

puppet是一個it自動化架構,用來幫助管理者管理大規模的網絡設施資源,使用靈活的、聲明式的實作方式來進行it自動化管理。

puppet的核心是manifest的概念,它描述了一個設施資源對預期的聲明(state)。在puppet中,聲明包括了以下方面:

安裝了哪些軟體包。

運作着哪些服務,不運作哪些服務。

軟體配置詳情。

2.6.1 puppet manifest檔案

puppet使用了基于ruby的dsl(domain specific language)在一組manifest檔案中來描述系統配置。例如,描述zookeeper的puppet manifest檔案如下:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

https://yqfile.alicdn.com/fdbca79e8f74a1c83946cc7e520807e8ab1fc299.png

" >

這個最簡單的manifest例子表明zookeeper作為一個服務已經安裝在機器上,并且服務是運作的。第一個package的代碼塊告訴puppet使用作業系統的包管理程式(例如,ubuntu/debian的apt-get,ret hat的yum等)來安裝3.3.5版本的zookeeper軟體包。第二個package代碼塊保證zookeeperd軟體包已經安裝。最後service代碼塊告訴puppet需要保證zookeeperd的系統服務正在運作,這個服務依賴于zookeeperd軟體包已經安裝。

為了示範puppet manifest檔案如何轉化為安裝軟體和系統聲明,讓我們安裝puppet并且使用前面的例子來安裝和啟動zookeeperd服務。

為了擷取最新版的puppet,需要将apt-get配置使用puppet實驗室的軟體源。執行下述指令來安裝最新版的puppet:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

然後,儲存前面列出的執行個體manifest檔案,命名為init.pp。使用puppet來應用這個manifest:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

https://yqfile.alicdn.com/708c253bb6c0483612612266b65a33c081e37036.png

當指令執行完後,檢視zookeeper服務是否正在運作:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

如果我們手動停止了zookeeper服務并且重新運作puppet apply指令,puppet不會重複執行安裝過程,但是會重新開機服務,因為在manifest檔案中定義的聲明中,服務是運作的。

2.6.2 puppet類和子產品

使用獨立的puppet manifest檔案很容易定義資源的聲明,但這種實作方法在需要管理的資源增多時變得越來越不友善。所幸是puppet有類和子產品的概念,可以用來更好地組織和隔離特定的配置詳情。

考慮到storm的場景,我們有多個節點的類。舉例來說,一個storm叢集會有nimbus節點,supervisor節點或者同時兼具兩種服務的節點。puppet類和子產品提供了一種區分不同配置角色的方法,可以混合搭配來友善地定義身具多種角色的資源。

舉例說明這個功能,回顧上面安裝zookeeper包的manifest檔案,将它重新定義為一個類,這樣包含多個類的manifest檔案就可以引用這個類:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門
《Storm分布式實時計算模式》——2.6 Puppet的快速入門

https://yqfile.alicdn.com/067b5787c0bb6b1de93f4f4110aa321c0df940c8.png" >

在前面的例子裡,我們将zookeeper的manifest檔案重新定義為puppet的類。這個類可以在其他類或manifest檔案中使用。第二行中,zookeeper類包含了另外一個類,jdk,引用這個類的定義,表示它聲明一個機器必須具備java jdk。

2.6.3 puppet模闆

puppet還利用ruby erb模闆系統來定義各種檔案的模闆,在puppet生成manifest時使用。當puppet運作時,會替換puppet erb模闆中ruby表達式和構造式。erb模闆中的ruby語句對manifest檔案中的puppet變量和定義有完全通路的權限。

下述puppet檔案聲明是用來生成storm.yaml配置檔案的:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

這個聲明告訴puppet,從storm.yaml.erb模闆中,在/etc/storm下建立storm.yaml檔案:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

https://yqfile.alicdn.com/6c59281b2792652a4f7a56f2a84ccfb728955197.png

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

模闆中的條件邏輯和變量擴充使我們在多種環境下可以使用同一個模闆檔案。舉例來說,如果環境中不需要storm drpc服務,則生成的storm.yaml檔案中就會忽略掉drpc.service的部分。

2.6.4 使用puppet hiera來管理環境

我們已經簡要介紹了puppet manifest、類和模闆的概念。你這時候可能會好奇,如何在一個puppet的類或manifest檔案中定義變量。在puppet類或manifest檔案中定義變量非常簡單,在manifest檔案和類中像下面這樣定義即可:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

https://yqfile.alicdn.com/7f78479726ed2ee325540e3dd7f92c1f531e640f.png

定義後,java_sersion變量就可以在類或manifest以及erb模闆中使用了;但是,這也帶來了不易複用的問題。如果我們将版本号等資訊寫死在代碼裡,就會因固定的變量值限制了這個類的複用效率。如果可以将變量擴充到可能潛在的各種變化值,配置管理會變得更容易維護。這就是hiera的用武之地。

2.6.5 介紹hiera

hiera是一個最新版puppet架構中內建的一個鍵值對的查找工具。hiera允許定義鍵值對分層結構(hierarchies,hiera的名字是縮寫),在結構中,父節點定義的值可以被子節點定義的值代替。

例如,考慮我們在storm叢集中需要給一些機器定義配置參數的場景。所有的機器會使用一套通用的鍵值對,比如說使用的java版本。是以我們将這些值定義在common.yaml中。從這裡開始,開始出現分化。我們可能有單節點僞叢集,也可能有多節點叢集。我們會将環境相關的變量放在特殊的檔案裡,比如“single-node.yaml”和“cluster.yaml”。

最後,我們會将機器相關的資訊寫在這種格式的檔案中:“[hostname].yaml”,如圖2-5所示。

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

https://yqfile.alicdn.com/47a44184940fbe138cc0b7905ed9d17cb5845056.png" >

puppet內建的hiera允許使用puppet内置變量來正确的解析檔案名稱。

第2章的示例源代碼目錄說明了如何實作檔案這種檔案組織方式。一個典型的common.yaml檔案可能定義全局屬性對所有的機器通用,如下格式:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

https://yqfile.alicdn.com/3513a2b336adcb51cb7f5741043bd621144e4d91.png

在environment級别,可以區分單節點和叢集配置的不同,cluster.yaml可以像下面這樣定義:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

最後,是定義機器相關的參數配置,使用對應的[hostname].yaml檔案,定義的puppet類會針對特定節點。

比如nimbus01.yaml,使用下列配置:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

對zookeeper01.yaml。使用下列代碼:

《Storm分布式實時計算模式》——2.6 Puppet的快速入門

https://yqfile.alicdn.com/ae4b198a31af8333c431134ff591d8ea4b2d3153.png

我們對puppet和hiera僅僅了解了皮毛。第2章的代碼中有額外的例子和文檔來說明如何使用puppet進行自動部署和配置任務。