2011/12/21

Puppet

http://puppetlabs.com/

Puppet 是一個 Client/Server 式的[配置|設定|服務]管理工具,它是用 Ruby 寫的。

簡單講,所有(Linux)機器的配置集中管理在 Puppet Server 上,
Puppet Client 機器連線到 Server 上取得對應的配置,並根據其內容對自己進行設定。

Puppet 並不是 scp 一個設定檔回來然後 Apply。
Puppet Client 使用一套用 Ruby 寫的叫 facter 的工具取得主機基本資訊。
Puppet Server 根據傳來的資訊(ex:IP, OS, RAM, etc.)編譯出相對應的配置檔並回傳。

在 Ubuntu 系統上安裝 Puppet 非常簡單:
sudo apt-get install ruby-full # 安裝 Ruby 環境
sudo apt-get install facter # 安裝 Facter 後可以直接執行 facter 測試一下
sudo apt-get install puppet # Puppet Client 套件 
sudo apt-get install puppetmaster # Puppet Server 套件,Client 不需安裝

# 在 Redhat 環境,Puppet Client 套件叫:puppet
# 在 Redhat 環境,Puppet Server 套件叫:puppet-server

Puppet 看待裝置或服務的哲學跟 UNIX 很像:
每一個裝置、服務對 Puppet 來說,都是一個「資源(Resource)」。



【*.pp】

Puppet 解讀名爲 *.pp 的檔案,然後對不同的 Client 編譯產生不同的配置。
一個簡單的 test.pp 檔案內容如下:
file
{
    "/tmp/test.txt": content => "hello, world";
}
執行:
puppet test.pp
執行結果是在 /tmp 底下產生一個 test.txt 檔,且內容爲「hello, world」。
*.pp 有一套簡單的文法與規則,其中亦有類別跟繼承等,強烈建議閱讀文件瞭解!



【Puppet Client/Server 運作流程】

1」Puppet Client 的 puppetd 程式呼叫 facter 程式,facter 程式會偵測出 Puppet Client 主機的相關資訊,例如 hostname、RAM、Hard Disk、IP 等等。Puppet Client 的 puppetd 再透過“SSL”把這些訊息傳到 Puppet Server。

2」Puppet Server 的 puppetmaster 程式檢查 Puppet Client 送來的資訊,會使用 Puppet Client 的 hostname 來找到 /etc/puppet/manifest 裡面對應的 node 配置,然後分析以及解讀牽涉到的 *.pp 檔或 Puppet 程式碼,Puppet Client 使用 facter 生成的訊息會被當成變數傳入這些 *.pp 檔或 Puppet 程式碼。

3」當 Puppet Server 知道需要處理哪些 *.pp 檔後,就會將它們進行解析,這個 *.pp 檔解析的動作可以看成是程式的編譯(或是直譯?)。解析會分成幾個階段,首先是語法檢查,語法錯誤就會直接報錯了;語法檢查通過,會產生解析的結果(僞代碼檔?),這個結果同樣會透過 SSL 傳送回 Puppet Client。

4」Puppet Client 收到 Puppet Server 的解析結果,然後執行,並且把執行的結果回傳。

5」Puppet Server 把 Puppet Client 的執行結果寫到 log。



【Puppet Client/Server 配置】

Puppet Client 與 Puppet Server 的安裝、設定、配置,最好都使用 root 帳號。

進行 Client/Server 設置前,請務必千萬確定每臺主機的 hostname!
Puppet 的 Client/Server 配置有綁定 hostname 進行驗證。
Puppet 要求符合 FQDN 的 hostname。
請先執行 hostname 並檢查 /etc/hostname 進行確定。
並確認 /etc/hosts 檔案有正確的 hostname 與 IP 配對。

連線與驗證都需要 root 身份來進行。
Puppet Client 與 Server 的系統時間要校正一致,否則認證會出問題!
建議主機使用同樣的 NTP Server 進行時間同步。
請特別注意!

在 Client/Server 環境中,Puppet Server 預設讀取 *.pp 的路徑是:
/etc/puppet/manifests/

可以編寫一個 /etc/puppet/manifests/site.pp 檔測試:
node default
{
    file
    {
        "/tmp/puppet_server.message":
        content => "Hello, Puppet Client!";
    }
}

第一次進行 Client/Server 的配置連線會需要驗證。
先在 Puppet Client 執行:
puppetd --server 伺服器主機名稱 --test
再到 Puppet Server 執行:
puppetca --sign 客戶端主機名稱
最後回到 Puppet Client 執行:
puppetd --server 伺服器主機名稱 --test
此時,Puppet Client 應該會產生一個內容爲「Puppet Manifest」的 /tmp/site.txt 檔。



【Puppet CA 驗証】

Puppet 的驗證文件預設:
Puppet Client:/var/lib/puppet/ssl
Puppet Server:/var/lib/puppet/ssl/ca/

若驗證有問題,在該資料夾下找到相對應的 *.pem,刪除舊的 *.pem 檔後,重新認證。

puppetca --list --all
puppetca --list
puppetca --sign CLIENT_HOSTNAME
puppetca --print CLIENT_HOSTNAME
puppetca --clean CLIENT_HOSTNAME  # 刪除舊的認証
man puppetca



【建議的 /etc/puppet/ 目錄架構】
manifests/
        site.pp
        templates.pp
        nodes.pp

modules/
        {module_name}

modules/user/

services/

clients/

notes/

plugins/

tools/
來源:http://projects.puppetlabs.com/projects/1/wiki/Puppet_Best_Practice



【使用 Puppet Module】

來源:http://docs.puppetlabs.com/guides/modules.html



【使用 Puppet Template】

Puppet Template 可以用來動態產生不同的內容。
應用的情境比較像是同樣的設定檔,但是有些許的設定不盡相同。
例如都是 httpd 服務,不見得所有 Puppet node 的 httpd.conf 都完全相同。

Puppet Template 檔是使用 Ruby 的 ERB Template,並不難寫。
請參考:http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html

Puppet Template 的使用也很簡單:
$value = template("my_template.erb")
my_template.erb 可換成 erb 檔的絕對路徑,或把 erb 檔放到 Puppet 預設會找的路徑。
Red Hat 環境通常是 /var/lib/puppet/templates;
Ubuntu 環境通常是 /etc/puppet/templates。
可以使用 puppet --configprint templatedir 指令確認。
實作的建議是把 erb 檔放到各個 Module 資料夾中。

題外話,可以執行 puppet --configprint all 看看 :-)

來源:http://docs.puppetlabs.com/guides/templating.html



【Puppet 設定檔範例】

https://github.com/ghoneycutt/puppet-generic



【Puppet 名詞解釋】

catalog : A catalog is the totality of resources, files, properties, etc, for a given system.

manifest : A configuration file written in the Puppet language. These files should have the .pp extension.

module : A collection of classes, resource types, files, and templates, organized around a particular purpose.

node (general noun) : An individual server; for the purposes of discussing Puppet, this generally refers to an agent node.

node (Puppet language keyword) : A collection of classes and/or resources to be applied to the agent node whose unique identifier (“certname”) matches the specified node name. Nodes defined in manifests allow inheritance, although this should be used with care due to the behavior of dynamic variable scoping.

provider : A simple implementation of a type; examples of package providers are dpkg and rpm, and examples of user providers are useradd and netinfo. Most often, providers are just Ruby wrappers around shell commands, and they are usually very short and thus easy to create.

templates : templates are ERB files used to generate configuration files for systems and are used in cases where the configuration file is not static but only requires minor changes based on variables that Puppet can provide (such as hostname). See also distributable file.

type : abstract description of a type of resource. Can be implemented as a native type, plug-in type, or defined type.

agent or agent node : An operating system instance managed by Puppet. This can be an operating system running on its own hardware or a virtual image.

來源:http://projects.puppetlabs.com/projects/puppet/wiki/Glossary_Of_Terms



強烈推薦文件:
http://puppet.wikidot.com

Reference:
http://puppet-manifest-share.googlecode.com/files/puppet-1.0.pdf
http://www.comeonsa.com/category/puppet/
http://bitcube.co.uk/content/puppet-errors-explained
http://www.example42.com
http://docs.puppetlabs.com/guides/troubleshooting.html
http://docs.puppetlabs.com/guides/troubleshooting.html
http://blog.akquinet.de/2011/11/23/managing-an-apache-server-with-puppet/