Puppet 自動化部署 – 設定第一個自動佈署工作(manifests)

2017-01-10 Puppet

在 Puppet 中必須撰寫 manifests 去佈署你的 Agent 伺服器,顧名思義 manifests 是每一個 node 的佈署清單,要做什麼事情都在 manifests 這邊撰寫,可以參考下圖架構關係

 

 

 

Master 和 Agent 之間取得佈署清單流程:

  1. Agent 傳送 catalog 內容包含 nodename (節點名稱) 和 facts (由 facter 所獲取的系統參數)
  2. Master 從 catalog 提供的資訊將 manifests 編譯重新打包 catalog
  3. 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).

  • 由 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

 

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱