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_name = $::apache::params,
$service_name = $::apache::params,
$service_enable = $::apache::params,
$service_manage = $::apache::params,
$service_ensure = $::apache::params,
$service_restart = $::apache::params,
) 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 出來,如果有興趣可以持續關注 ...
參考資料:
Syntax: Relationship metaparameters
Orignal From: Puppet 4 自動化部署 – 利用 module 更簡化 manifest 的設定檔
沒有留言:
張貼留言