武偉 360雲計算 node
女主宣言mysql
由puppet自動化集羣管理基礎篇,咱們瞭解了puppet系統的基本架構、配置方法、資源以及簡單的應用。對於大廠來講,puppet簡單應用很難有效解決集羣管理中的問題,急需開發模塊化、可複用的puppet代碼結構。接下來做者將帶領你們對puppet中的environments、hiera、module、facter、模板進行介紹,從而輕鬆實現大廠中對大量軟件包、配置文件、服務等的管理。正則表達式
PS:豐富的一線技術、多元化的表現形式,盡在「360雲計算」,點關注哦!sql
上次咱們談了puppet系統的架構、配置以及簡單的應用。此次咱們將進一步介紹如何編寫模塊化的puppet代碼。其中,咱們將涉及到puppet系統中的幾個重要概念,包括environments、hiera、module、facter、模板等,經過這幾個概念的結合,能夠輕鬆的實現可複用的puppet代碼。json
首先,在咱們的工做中,通常分爲開發環境、測試環境、和生產環境。全部的代碼在上線以前,都須要在測試環境中進行屢次、多項指標的測試。沒問題以後,才能夠將代碼放入生產環境進行上線。那麼puppet是怎麼對各類環境進行管理的呢?下來咱們開始講解puppet。安全
1ruby
Environments服務器
爲了隔離開發環境、線上環境和測試環境,咱們充分引入了puppet的environment模塊。Puppet主配置文件puppet.conf中的environmentpath變量指明瞭puppet將要查詢的environments文件夾的路徑。若是有多個值,須要以冒號分隔。若是路徑中有相同的environment名稱,則以第一個路徑下的environment爲準。Puppet默認會先從environment目錄下的modules目錄中加載模塊,若是爲空,會從puppet.conf文件夾的basemodulepath所指的目錄下查找模塊。架構
Configuring environmentside
在全局的puppet.conf配置文件中設置basemodulebath/modulepath的值。
basemodulepath= $confdir/modules:
$confdir/environments/$environment/modules
Creating environments
在$confdir目錄下創建environments文件夾,目錄結構以下。
其中,每一個environment.conf都是這個環境模塊的主配置文件。能夠覆蓋全局配置文件puppet.conf中所設置的變量的值。變量Environment_timeout設置了puppet master刷新環境信息的頻率。不設置時,值爲0,會影響master的性能,可是給代碼部署帶來了方便。因此一旦熟悉了代碼部署,就應該設置該值爲無限大,即environment_timeout = unlimited。
測試模塊路徑是否配置正確。
Synchronizing environments
Agent在執行不一樣環境的同步命令時,只須要給environment參數賦予不一樣的值便可。固然你也能夠在agent的puppet.conf配置文件中設置environment的值。
同步線上環境:
Puppet agent -t --environment=production
同步測試環境:
Puppet agent -t --environment=staging
2
模塊
由environments的組織結構知道,每種環境都是由模塊和該環境的配置文件組成。那麼什麼是模塊呢?
寫模塊前須要注意的三個問題:
你的模塊須要實現什麼任務?
你的模塊是怎麼組織工做的?
在你的puppet環境中,你的模塊應該具備什麼更好的功能?
puppet使用模塊來存放類,在模塊中定義的類都會在puppet編譯catalog時進行自動加載。模塊的命名必須使用小寫字母開頭,名稱中只能包含:小寫字母、數字和下劃線,所以正則表達式知足:[a-z][a-z0-9_]*。爲了使得puppet可以找到相應的類,須要在puppet.conf中設置modulepath的值,如今已經廢棄,使用了basemodulepath。
模塊結構
Manifests:存放全部的.pp文件,即puppet的類文件。其中init.pp文件比較特殊,通常會包含一個和模塊同名的類,不可以自定義init名稱的類。其餘類的命名方法以下。
劃分類名稱部分的雙冒號稱爲命名空間分隔符。每一個子文件夾都是一個命名空間。
Files:包含了全部的nodes節點須要下載的文件。Source屬性賦值方式以下:puppet:///modules/my_module/service.conf,注意路徑裏面沒有files目錄,而且puppet後面爲三個反斜槓。形式以下。
puppet:///modules/my_module/service.conf將映射到my_module/files/service.conf個文件。
Lib:存放插件,包括自定義的facts和自定義資源類型。這些都會被puppet master和puppet agent服務使用到,當他們被請求到時,這些配置會被同步到node。
Templates:包含被manifests文件夾下的文件所使用的.erb或者.epp文件。對於erb文件,使用了ruby中的template函數;對於epp文件,使用了puppet語法,調用了epp函數。模板的輸出是一個字符串,做爲file資源中的content屬性的值。Template和epp被調用的方法以下。
所以,template('my_module/component.erb')將被映射到my_module/templates/component.erb文件。
Facts.d:存放外部的facts變量這些將被同步到全部的node節點,因此node節點能夠提交這些變量的值給puppet master(facter >= 2.0.1)。
Examples:包含了如何聲明模塊類和類型的樣本。
Spec:存放了lib目錄下全部插件的spec文件。
Functions:存放自定義的puppet語言的函數。
Types:存放類型的別名。
Installing modules
你徹底能夠根據模塊的結構自行創建模塊內容。可是爲了方便,puppet提供了命令行工具,只需一條命令便可創建模塊。如:在開始寫模塊時,能夠利用Puppet module generate <USERNAME>-<MODULE NAME生成一個基本的模塊架構,而後就是填空題。可是名稱必須以「-」分割(很不友好),且只能包含一個,形如username-modulename。
可使用--skip-interview參數過濾掉全部的提問。創建的模塊結構以下。
其中metadata.json描述了全部的模塊信息。
Publish modules
咱們能夠將本身開發的module發佈到forge倉庫。Forge倉庫是模塊的社區倉庫,方便管理和下載部署。
本身的模塊通常有兩個名字:一個短名稱,如「mysql」;一個長名稱,加上本身的用戶名如「puppetlab-mysql」。
Forge倉庫須要長名稱,且要有metadata.json,這個是由於forge會將長模塊名分紅username/module的格式。
在磁盤上時,只能運用短名稱。
發佈步驟:
在puppet官網建立一個forge帳號。
建立一個不包含任何無用信息的模塊,而且有正確的metadata.json文件,且都是UTF-8編碼。若是使用命令行生成的module,默認都是UTF-8編碼。
刪除模塊中的符號連接。否則在製做模塊時會報錯。
創建模塊。Puppet module build <MODULE DIRECTORY>,生成一個.tar.gz的包,放在了模塊目錄的pkg子目錄中。
上傳模塊到forge倉庫。模塊必須小於等於10M。
3
類
由模塊的目錄結構,咱們能夠看到,每一個模塊都是由許多.pp文件組成的,即每一個模塊都包含了不少的類文件。類中包含了全部的資源,一般類被存儲在模塊的manifests文件夾下puppet會經過類名自動加載這些類。
Designingclass
類中傳入的參數就相似於類中的屬性,一旦該類被其餘類所繼承(inherits),該參數、類中的變量以及資源都可被其餘類直接使用,這樣的話這些參數必須由默認值或者是自動查找外部數據賦值(hiera),在繼承類中沒法對這些參數賦值。這樣的話,模塊的結構就能夠肯定了,init.pp入口文件中聲明的主類繼承參數類params,該模塊下的全部文件(除了params)都繼承init.pp中聲明的主類。
一般,一個類的定義形式以下。
在類的編寫過程當中,咱們一般會用到標準庫中的函數Include、require、contain和hiera_include,這些函數可讓你安全的聲明屢次類,無論你聲明多少次,類只會被添加到編譯目錄中一次,解決了多重依賴致使的問題。
Using include
Include函數是標準的聲明類的方式。
Using require
Require函數聲明瞭一個或多個被父類依賴的類,其次也能夠聲明一個類所依賴的文件。
Using contain
contain即包含了被聲明的類,屬於父類的一部分。
Using hiera_include
Puppet經過hiera機制自動的搜索hiera數據做爲類模塊的參數。可是這一切都是基於hiera配置的。Puppet目錄下的hiera.yaml配置文件以下所示。
Puppet目錄下的hiera數據採用myclass::parameter_one的形式,參數若是沒有默認值則報錯。因此通常都要給默認的參數賦予默認值。就相似於空指針,聲明指針的同時必定要初始化。另外還有特殊的兩個變量,title和name不能做爲參數傳遞。
經過hiera能夠將節點相關的配置從manifests中分離出來。Manifests用於完成不一樣功能的模塊,使用hiera Data調用這些線程的模塊將其應用到服務器中。使得節點自定義的配置更容易。應用到節點的個性配置只保存在hiera中。在有新的環境須要部署時,不須要更改manifests中的代碼,只須要在hiera中賦予此節點須要的配置數據便可。
Important class keywords
Before:當前者資源(before上面的)成功執行後,再通知下一資源(before後面的)執行。
Require:在本資源執行以前,須要確認其餘資源是否已經成功被執行。
Notify:主動通知其餘資源本資源的狀態。
Subscribe:用於被動通知,當subscribe資源公有屬性檢測依賴資源變化時,主動更新所在資源狀態。
->:就至關於箭頭符號,指出動做的流向。先執行箭頭以前的動做,再執行箭頭以後的動做。兩個資源的首字母要大寫。
~>:指出動做的流向,若是前一個動做執行失敗,則後一個動做中止執行。
4
總結
在本文章中,咱們討論瞭如何同步不一樣的puppet環境,進一步討論瞭如何創建不一樣環境下的模塊,最後介紹了模塊中類的結構和設計方法。經過將environments、module、class、hiera等puppet機制結合使用,咱們能夠輕鬆實現模塊化的puppet代碼,在針對不一樣的安裝包、配置文件、執行腳本等資源時能夠輕鬆實現複用。