在 Puppet 中必須撰寫 manifests 去佈署你的 Agent 伺服器,顧名思義 manifests 是每一個 node 的佈署清單,要做什麼事情都在 manifests 這邊撰寫,可以參考下圖架構關係
Master 和 Agent 之間取得佈署清單流程:
- Agent 傳送 catalog 內容包含 nodename (節點名稱) 和 facts (由 facter 所獲取的系統參數)
- Master 從 catalog 提供的資訊將 manifests 編譯重新打包 catalog。
- Agent 收到 catalog 後執行佈署工作,並且回應 Report 給 Master 執行結果。
Master 和 Agent 提交的關係有很多種:
由 Master 設定的 puppet kick 觸發更新- puppet kick 從 Puppet 4 以後不支援
Be sure to specify a filter to limit the number of nodes; you should generally invoke this action on fewer than 10 nodes at a time, especially if the agent service is running and you cannot specify extra options (see above).
- puppet kick 從 Puppet 4 以後不支援
- 由 Agent 設定的 runinterval 觸發更新
- MCollective 的 MQ (Message Queue) 更新
- etc
實際運用關係到你的環境有多少台 Server 需要佈署,據說用 1 台Puppet + Hadoop,能夠支撐近千台的 Agent !?,不過如果你的環境有這麼多的 Agent 節點,那你的 Puppet 如果只使用一台心臟也太大顆。
在 manifests 佈署計畫裡,僅需要在 Master 上撰寫,當 manifests 寫好後並不需要重啟 Puppet service 立即生效,這時候 Puppet environment 就相對重要了。
目標:
- agent01.puppet.com 這台伺服器必須安裝 chrony 校時。
- agent02.puppet.com 這台伺服器必須安裝 httpd。
建立第一個 manifests – chrony
在建立 manifests 前或許你可以先查看有哪些 resource 能夠使用,在這邊簡單利用 package + service 去安裝 chrony
node 'agent01.puppet.com' { package { 'chrony': name => 'chrony', ensure => present, } service { 'chrony': name => 'chrony', ensure => running, enable => true, } }
- node 定義為你的 agent 目標
- package 安裝套件
- 第一個 package title: 定義 package 名稱,通常設定為 package name,但實際安裝 package name 建議使用 name 定義。
- name:則為你要安裝的套件名稱,如果你有多 OS 就一定要用 name 去設定 package name,否則預設將採用 package title name。
- ensure:進行的動作為 present (同 installed )
- service 同 package,但 ensure 狀態為 running,因為我們希望安裝好後為服務是啟動的。
在這邊我範例寫的是 Ubuntu 的 chrony,如果你是 CentOS/Redhat 系列,service 請用 “chronyd”
**如果有多 OS 環境小弟建議可以採用 case or if 判斷式去寫你的 manifests/modules。
第二個 manifests 範例 – apache
在第二個範例除了安裝 apache 以外還要用 file 建立一個測試檔案
node 'agent02.puppet.com' { package { 'apache': name => 'apache2', ensure => present, } -> file { ['/var/www/html','/var/www/html/agent02.puppet.com']: ensure => 'directory', owner => 'www-data', group => 'www-data', mode => '700', } -> file { '/var/www/html/agent02.puppet.com/index.html': content => "This puppet testing from $fqdn", owner => 'www-data', group => 'www-data', mode => '0400', } -> service { 'apache': name => 'apache2', ensure => running, enable => true, } }
在這邊使用了 -> 這個符號代表執行的順序是:
package -> 建立目錄 agent02.puppet.com -> 建立 index.html 檔案 -> 啟動 apache 服務。
file 則是可以拿來建立”目錄”或”檔案”,當中目錄又可以指定多個目錄來表達你想要的目錄結構。
$fqdn 則是用了從 agent 那邊 facter 來的 facts 資訊。
Puppet agnet 驗證
寫好 manifests 之後就要讓 agent 更新,由於是在測試階段,所以直接使用 puppet agent -t 進行測試更新
# in agent $ puppet agent -t .. .. Notice: Applied catalog in 0.07 seconds
**如果僅是想測試 manifests 而不想執行佈署可以使用 –noop
最後你收到的訊息應該是 Applied catalog,表示執行完成,可以檢測安裝的 apache or chrony,如果出現錯誤代表 manifests 寫的有誤。
參考資料:
Image from people.cs.ksu.edu