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

2017-01-30 Puppet

之前介紹用 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_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 繼承過來,直接用 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 出來,如果有興趣可以持續關注 …

 

 

 

參考資料:

Module fundamentals

Syntax: Relationship metaparameters

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱