第一個 module 設定
Module 是 Puppet 管理中非常重要的一環,利用已經編寫好的 module 在 manifests 就不需要在打上落落長的設定檔。
從哪裡找 Module
除了我們自己寫的 module 以外,還可以直接用別人已經寫好的 module 當你開始會用 module 的時候,就會發現其實 Puppet 的 module 型態幾乎無所不在,利用 module 你可以輕鬆的兜出 infrastructure,但是你在使用別人 module 的時候 篩選就是非常重要的議題 用到對的 module 讓你上天堂,天天準時下班,用到錯的 module 你會恨到乾脆自己來寫 module。
從 Puppetforge 獲取 module
Puppetforge 是 Puppet 提供的一個 module 管理平台,你可以透過這個平台來找到各種你想要的 Puppet module。
從 Github 獲取 module
除了 Puppetforge 以外,最多資源的就是在 Github,就因為資源太多更需要慎選。
如何挑選 Module
由於 Puppet 已經算是很成熟的組態管理工具,所以 module 也是琳琅滿目,但是要怎麼去篩選適合的 module 就是一個很重要的課題。
從維護者挑選
- Puppet 官方維護的 Puppetlabs
Puppetlabs 是官方提供的模組,不見得會是最新,但是會是最穩定的 module,基本上沒有太多問題,而且也沒有 EOL 的問題,而且 Test case 也算是最完整的。
- Github 維護的 voxpupuli
voxpupuli 是由 Github 內部維護的 module,也算是穩定中可選的 module,有許多由 Puppetlabs 官方維護的 module 會直接移轉給 voxpupuli 進行維護,例如 puppet-nginx,算是除了 Puppetlabs 的第三方授權。
- 由套件本身官方維護的 module
各種套件本身會維護自己的 Puppet module,例如 Elastic 就維護 puppet-elasticsearch、puppet-kibana、puppet-logstash
適用自己環境
- OS platform
- Features
- Puppet version
除了以上建議的 module 來源以外,除非這個 module 你有能力做後續的維護,否則都不建議使用。
動手寫 Module
如果覺得線上的所有 module 都不符合你的需求,可以自己動手寫,在這篇會以基礎的 module 方向去寫。
你可以把 module 放在以下位置:
- /etc/puppetlabs/code/environments/production/modules
- /etc/puppetlabs/code/modules
- /opt/puppetlabs/puppet/modules
基礎 module 檔案結構
以一個 apache module 為例,我會需要產生以下這些檔案結構
$ tree /etc/puppetlabs/code/modules/apache
├── files
| └── default.conf
└── manifests
├── init.pp
├── install.pp
├── config.pp
├── service.pp
module 的 manifests
init.pp 是預設被讀取的檔案,通常用來定義變數、引用 class。
class apache (
String $package_name = 'apache2',
String $package_ensure = 'installed',
String $service_name = 'apache2',
String $service_ensure = 'running',
String $default_site_conf = '/etc/apache2/sites-enabled/default.conf',
String $run_user = 'www-data',
){
contain apache::install
contain apache::config
contain apache::service
Class['::apache::install']
-> Class['::apache::config']
~> Class['::apache::service']
}
install.pp 用來定義如何安裝 package。
class apache::install inherits apache {
package { $apache::package_name:
ensure => $apache::package_ensure
}
}
service.pp 用來處理服務
class apache::service inherits apache {
service { $apache::service_name:
ensure => $apache::service_ensure,
subscribe => Package['apache'],
require => Class['apache::install']
}
}
config.pp 用來處理設定檔
class apache::config inherits apache {
file { $apache::default_site_conf:
ensure => file,
owner => $apache::run_user,
source => "puppet:///modules/${module_name}/default.conf"
}
}
怎麼引用 module
要引用 module 只需要使用 include 就可以把已經寫好的 apache module 引用進來
node default {
include ::apache
}
只要三行、三行、三行 !! 就完成佈署安裝 apache 了
這樣 Puppet code 就簡潔許多了,恭喜你已經學會了基本的 module 寫法,可以再往進階 module 前進。