之前介紹用 manifests 佈署,但是只是要安裝一個 nginx 就要寫那麼多行,如果是更複雜的設定那這個 node 的設定檔就會寫得很長,如此可見有 n 台 node 的時候這個 manifests 將會非常可觀,不過小弟說過 Puppet 幾乎無所不能的彈性,所以 …
Puppet 是一個有模組概念的工具,利用已經編寫好的 module 在 manifests 就不需要在打上落落長的設定檔,底下我會示範如何安裝 module、編寫模組 module,然後利用 module 來寫 manifests 看出差異
安裝 Puppet module
如果你不想自己寫 module 的話,你可以直接用 Puppet module 直接安裝已經有人寫好的 module,以 apache 為例:
Step.1 先搜尋存在於 Puppet 有 apache 關鍵字的 module
# in master $ puppet module search apache
沒意外你會搜出一堆跟山一樣的 apache,因為 Puppet 在國外是非常盛行的,早有一堆人寫好工具了。
要如何挑選 Module
挑選 Module 有幾個重點:
- Puppet 支援版本:Puppet 3 和 4 的寫法有蠻多的差異,所以選擇之前記得看看是否支援你目前安裝的 Puppet 版本。
- 支援的 node OS 版本。
- 是否適合你需要的設定需求。
以官方的 puppetlabs-apache 為例,可以到 puppetforge 去查看:
Latest version is compatible with:
- Puppet Enterprise 2016.4.x, 2016.2.x, 2016.1.x, 2015.3.x, 2015.2.x, 3.8.x, 3.7.x, 3.3.x, 3.2.x, 3.1.x
- Puppet >= 3.0.0 < 5.0.0
- RedHat, Ubuntu, Debian, SLES, Scientific, CentOS, OracleLinux
再來就是要查看 README 的設定方式,在 Puppet 裡面選擇 module 和你在挑選套件一樣,可以選擇擁有穩定支援的 puppetlabs 官方、也可以選擇其他第三方寫 module,最重要的是能符合你的需求,從中學習人家在 module 如何寫的好,並且建議要有辦法維護才是重點,如果你不想維護的話那就選定 puppetlabs,或是有商業支援的 example42 吧。
Step.2 安裝 puppetlabs module
$ puppet module install puppetlabs-apache Notice: Preparing to install into /etc/puppetlabs/code/environments/production/modules ... Notice: Downloading from https://forgeapi.puppet.com ... Notice: Installing -- do not interrupt ... /etc/puppetlabs/code/environments/production/modules └─┬ puppetlabs-apache (v1.11.0) ├── puppetlabs-concat (v2.2.0) └── puppetlabs-stdlib (v4.14.0)
用 puppet 安裝 module 的好處是他可以幫你把作者 module 需要的相依性工具安裝起來,如很常見的 puppetlabs-concat、puppetlabs-stdlib。
在 Puppet 4 中 module 安裝的路徑位於 /etc/puppetlabs/code/environments/production/modules,再來直接看用 module 佈署 manifest
編寫 puppet module
對於 Puppet module,小弟是比較喜歡自行撰寫,以 puppetlabs-apache 來說,裡面寫了太多我不需要的 OS type 和設定,先不論 puppetlabs-apache 的寫的有多好,若是遇到自己公司需要的特殊調整,要維護別人的 source code 我是比較不喜歡的,puppet module 的撰寫並不難,有一點點的程式 or script 基礎就能夠上手。
要寫 puppet module 自學可以先從下載別人的 module 來學習,在 github 也有很多的 open source 可以學習,但老話一句 “注意 Puppet 版本”
Step.1 建立 apache module,參考以下檔案結構
$ tree /etc/puppetlabs/code/environments/production/modules/apache ├── README ├── files # 在模組可以被引用的檔案 └── manifests # 佈署設定 │ ├── init.pp # 預設加載 init.pp,可以用 ::apache::params 這樣加載其他文件 │ ├── package.pp # 通常寫安裝package的方式 │ ├── params.pp # 通常記錄Global變數值 │ ├── service.pp # 通常寫服務的狀態 └── templates # 範本檔,可以透過變數來編寫這個檔案
Step.2 建立 manifests 的第一隻 init.pp
$ vim /etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp class apache ( $package_ensure = $::apache::params::package_ensure, $package_name = $::apache::params::package_name, $service_name = $::apache::params::service_name, $service_enable = $::apache::params::service_enable, $service_ensure = $::apache::params::service_ensure, ) inherits ::apache::params { include '::apache::package' include '::apache::service' Class['::apache::package'] -> Class['::apache::service'] }
在 init.pp 中,把一些變數先在 init.pp 這邊做宣告,然後把參數都 ::apache::params 給了 params.pp 這邊做設定,然後把變數從 params 繼承過來;
include package 和 service 之後用 -> 來表示要執行的順序為先 package 後 service
還可以用 before, require, notify 等來表達順序和觸發服務重啟。
Step.4 宣告變數值的 params.pp
$ vim /etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp class apache::params { $package_name = 'apache2' $package_ensure = 'present' $service_ensure = 'running' $service_enable = true $service_name = 'apache2' } }
params 通常不做任何事情,這邊都是宣告變數值使用,這邊也常寫 case 來定義每個 OS 的特殊值。
Step.5 安裝的 package.pp
$ vim /etc/puppetlabs/code/environments/production/modules/apache/manifests/package.pp class apache::package inherits ::apache::params { package { 'apache': ensure => $package_ensure, name => $package_name, } }
變數一樣從 params 繼承過來,直接用 resource 的 package 來寫。
Step.6 關於服務的 service.pp
$ vim /etc/puppetlabs/code/environments/production/modules/apache/manifests/service.pp class apache::service inherits ::apache::params { service { 'apache': ensure => $service_ensure, name => $service_name, enable => $service_enable, } }
在 params 宣告啟動的服務是 apache 並且為 running !!
這樣就寫完一個簡單的 apache 的安裝 module。
測試模組
Puppet 有提供 apply 來測試你的 module 是否能夠執行成功
$ puppet apply init.pp Notice: Compiled catalog for master.puppet.com in environment production in 0.05 seconds Notice: Applied catalog in 0.01 seconds
出現 applied catalog .. 通常測試成功了!
用 module 佈署 manifest
寫完 module 後,要直接應用在 manifest 佈署 node
$ vim /etc/puppetlabs/code/environments/production/manifests/site.pp node 'agent.puppet.com' { class { 'apache': } }
只要三行、三行、三行 !! 就完成佈署安裝 apache 了,當然如果你還需要加入設定的話,你的 module 就更不只只有寫這樣了 ..
小弟也有在寫 puppet 的 module,之後也都會 open source 出來,如果有興趣可以持續關注 …
參考資料: