2017年1月30日 星期一

Puppet 4 自動化部署 – 利用 module 更簡化 manifest 的設定檔

之前介紹用 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-concatpuppetlabs-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 繼承過來,直接用 resourcepackage 來寫。

 

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 的設定檔

沒有留言:

張貼留言