天天看點

Puppet使用方法總結

原文:

http://dongxicheng.org/cluster-managemant/puppet/

1.  概述

puppet是一個開源的軟體自動化配置和部署工具,它使用簡單且功能強大,正得到了越來越多地關注,現在很多大型IT公司均在使用puppet對叢集中的軟體進行管理和部署,如google利用puppet管理超過6000台地mac桌面電腦(2007年資料)。

本文主要介紹puppet安裝方法,設計架構及使用方法。

2.  設計架構

puppet是基于c/s架構的。伺服器端儲存着所有對用戶端伺服器的配置代碼,在puppet裡面叫做manifest. 用戶端下載下傳manifest之後,可以根據manifest對伺服器進行配置,例如軟體包管理,使用者管理和檔案管理等等。

Puppet使用方法總結

如上圖所示,puppet的工作流程如下:(1)用戶端puppetd調用facter,facter探測出主機的一些變量,例如主機名,記憶體大小,ip位址等。pupppetd 把這些資訊通過ssl連接配接發送到伺服器端; (2)伺服器端的puppetmaster 檢測用戶端的主機名,然後找到manifest裡面對應的node配置, 并對該部分内容進行解析,facter送過來的資訊可以作為變量處理,node牽涉到的代碼才解析,其他沒牽涉的代碼不解析。解析分為幾個階段,文法檢查,如果文法錯誤就報錯。如果文法沒錯,就繼續解析,解析的結果生成一個中間的“僞代碼”,然後把僞代碼發給用戶端;(3)用戶端接收到“僞代碼”,并且執行,用戶端把執行結果發送給伺服器;(4)伺服器端把用戶端的執行結果寫入日志。

puppet工作過程中有兩點值得注意,第一,為了保證安全,client和master之間是基于ssl和證書的,隻有經master證書認證的client可以與master通信;第二,puppet會讓系統保持在你所期望的某種狀态并一直維持下去,如檢測某個檔案并保證其一直存在,保證ssh服務始終開啟,如果檔案被删除了或者ssh服務被關閉了,puppet下次執行時(預設30分鐘),會重新建立該檔案或者啟動ssh服務。

3.  軟體安裝

不推薦使用apt-get指令進行安裝,因為該指令下載下傳的puppet存在bug。可直接從源代碼進行安裝,需要安裝的軟體有ruby,facter和puppet。

3.1   安裝步驟

編輯/etc/host以修改主機名,因為puppet是基于證書的,證書中包含主機名;

在master和slave上依次安裝ruby、facter和puppet,安裝facter和puppet時,要使用ruby install.rb。

3.2    安裝後的目錄結構

(1)    安裝目錄

安裝目錄預設存為/etc/puppet,該目錄下的manifests存放manifest檔案。

其他可執行檔案在/user/sbin下,主要有:

puppet: 用于執行使用者所寫獨立的mainfests檔案,如:

puppet -l /tmp/manifest.log manifest.pp

puppetd: 運作在被管理主機上的用戶端程式,如:

puppet –server servername –waitforcert 60

puppetmasterd:運作在管理機上的伺服器程式,如:

puppetmasterd –debug

puppetca puppet認證程式,主要用于對slave的證書進行認證,如:

檢視需認證的slave:puppetca –list

對這些slave進行認證:puppetca -s –a

puppetrun 用于連接配接用戶端,強制運作本地配置檔案,如:

puppetrun -p 10 –host host1 –host host2 -t remotefile -t webserver

(2)    配置檔案

puppet.conf

Puppet的主配置檔案,如果是root使用者,配置檔案為/etc/puppet/puppet.conf,普通使用者,配置檔案為:~user/.puppet/puppet.conf

具體配置參數,參見:

http://docs.puppetlabs.com/references/stable/configuration.html#configuration-files

fileserver.conf

puppet檔案伺服器的配置檔案。用path配置檔案路徑,allow/deny配置通路權限,具體參見:http://docs.puppetlabs.com/guides/file_serving.html

3.3   驗證安裝是否成功

標明一個slave與master進行驗證,假設slave的host為slave00,master的host為masterhost,在slave00上輸入:

puppetd –test –server servername

然後在masterhost上檢視待認證的slave:

puppetca –list

如果沒問題的話,此時可以看到slave00,對該slave的證書進行簽名:

puppetca -s -a

這樣slave00通過了證書驗證,可以與master進行進一步互動了。

在masterhost的/etc/puppet/manifests目錄下編寫site.pp檔案,内容如下:

node default {

file {

“/tmp/test”:

content=>”hello\n”,

mode => 0644;

}

同時在slave00上輸入:puppetd –test –server servername, 檢視slave00的/tmp檔案夾,生成了一個新檔案test,裡面的内容是hello,該檔案的權限是-rw-r—r—。這樣,便證明puppet安裝成功,如果出現錯誤,檢視第六節。

4.  配置腳本編寫

本節介紹puppet的配置腳本編寫方法,主要是指puppet的manifest編寫方法。puppet把需要管理的内容抽象成為資源,每種資源有不同的屬性,是以puppet語言就是描述這些資源的屬性以及資源之間關系的語言。

為了便于管理,puppet将資源子產品化,即每個功能子產品的manifest單獨放在一個目錄下。每個子產品包含一個主要的manifest檔案(init.pp,它是子產品的入口,類似于C語言中的main函數),裡面包含若幹個class對該子產品的資源進行封裝,常見的資源有file,package,service等,每種資源由自己的屬性,如file有屬性name,owner,mode等。

本節主要介紹puppet中manifest的編寫方法,将依次介紹資源屬性,資源,節點管理,函數和子產品的編寫方法。

4.1   資源屬性

資源屬性有兩種,一種是資源專屬屬性,另一種是資源共同屬性,對于資源專屬屬性,将在下一節介紹;而資源共同屬性是所有資源共有的屬性,主要有:

before

用于控制不同對象(資源)的執行順序關系,表示某個對象(資源)在另一個對象之後發生(require與之相反,它表示之前發生)。如:

file { “/var/nagios/configuration”:

source  => “…”,

recurse => true,

before => Exec["nagios-rebuid"]

exec { “nagios-rebuild”:

command => “/usr/bin/make”,

cwd => “/var/nagios/configuration”

這段代碼保證用make編譯之前,所有代碼都是最新的。也可以before多個資源,如:

before => [ File["/usr/local"], File["/usr/local/scripts"] ]

subscribe

檢測某個資源,當它發生變化時,該資源會重新加載,如:

class nagios {

file { “/etc/nagios/nagios.conf”:

source => “puppet://server/module/nagios.conf”,

alias => nagconf # just to make things easier for me

service { nagios:

ensure => running,

subscribe => File[nagconf]

當檢測到檔案nagconf被修改時,服務nagios會相應的更新。需要注意的是,目前支援subscribe的資源隻有exec,service和mount。

更多資料,參見:http://docs.puppetlabs.com/references/latest/metaparameter.html

4.2   資源

常用的資源主要有以下幾個:

file:檔案管理

package:軟體包管理

service:系統服務管理

cron:配置定期任務

exec:運作shell指令

(1)    file資源

更詳細資料,可參見:http://puppet.wikidot.com/file

(2)    package資源

更詳細資料,可參見:http://puppet.wikidot.com/package

(3)    service資源

更詳細資料,可參見:http://puppet.wikidot.com/srv

(4)    exec資源

更詳細資料,可參見:http://puppet.wikidot.com/exec

(5)    cron資源

更詳細資料,可參見:http://puppet.wikidot.com/cron

4.3   節點管理

puppet如何區分不同的用戶端,并且給不同的服務端配置設定manifest呢?puppet使用node資源做這件事情,node 後面跟用戶端的主機名,例如:

node ‘ slave00 ‘ {

include ssh

node ‘ slave11 ‘ {

$networktype=”tele”

$nagioscheckport=”80,22,3306″

include apache, mysql, php

資源node中可使用變量,也可直接通過include把其他manifest包含進來。

更詳細資料,可參見:http://docs.puppetlabs.com/references/latest/type.html

4.4   類和函數

類可以把多個相關的資源定義在一起,組成一個類。類可以繼承,具體參見:http://docs.puppetlabs.com/guides/language_guide.html#resource-collections

函數(在puppet中稱為“defination”)可以把多個資源包裝成一個資源,或者把一個資源包裝成一個模型,便于使用。例如,在debian裡面管理一個apache虛拟機非常簡單,把一個虛拟主機的配置檔案放到/etc/sites-available/裡面,然後做一個符号連結到/etc/sites-enabled目錄。 你可以為你每個虛拟主機複制同樣的配置代碼,但是如果你使用下面的代碼就會更好和更簡單:

define virtual_host($docroot, $ip, $order = 500, $ensure = “enabled”) {

$file = “/etc/sites-available/$name.conf”

# The template fills in the docroot, ip, and name.

file { $file:

content => template(“virtual_host.erb”),

notify  => Service[apache]

file { “/etc/sites-enabled/$order-$name.conf”:

ensure => $ensure ? {

enabled  => $file,

disabled => absent

然後,你就可以使用這個定義來管理一個apache虛拟主機,如下面代碼所示:

virtual_host { “reductivelabs.com”:

order   => 100,

ip      => “192.168.0.100″,

docroot => “/var/www/reductivelabs.com/htdocs”

4.5   子產品

一個子產品就是一個/etc/puppet/modules目錄下面的一個目錄和它的子目錄,在puppet的主檔案site.pp裡面用import modulename可以插入子產品。新版本的puppet可以自動插入/etc/puppet/modules目錄下的子產品。引入子產品,可以結構化代碼,便于分享和管理。例如關于apache的所有配置都寫到apache子產品下面。一個子產品目錄下面通常包括三個目錄:files,manifests,templates。manifests 裡面必須要包括一個init.pp的檔案,這是該子產品的初始(入口)檔案,導入一個子產品的時候,會從init.pp開始執行。可以把所有的代碼都寫到init.pp裡面,也可以分成多個pp檔案,init 再去包含其他檔案。files目錄是該子產品的檔案釋出目錄,puppet提供一個檔案分發機制,類似rsync的子產品。templates 目錄包含erb模型檔案,這個和file資源的template屬性有關。

puppet安裝好以後,modules目錄是沒有的,自己建立一個就行,然後在裡面可以新增加你的子產品。

5.  程式設計執行個體

5.1    Hello World

本節介紹了一個非常簡單的程式設計執行個體:一個slave從master中擷取其manifest,該maniftest要求slave依次做以下工作:安裝gcc,建立檔案夾/home/dxc/test,下載下傳檔案hello.c程式,編譯hello.c。

(1)    代碼結構組織

Master上代碼的目錄結構如下:

|– auth.conf

|– fileserver.conf   #puppet檔案伺服器配置檔案

|– manifests   #puppet主檔案所在目錄

|   |– modules.pp        #puppet各個子產品彙總

|   |– nodes         #各個slave要處理的子產品

|   |   `– execHello.pp      #hello子產品對應由那些slave處理

|   `– site.pp                  #puppet主檔案(入口檔案)

|– modules     #puppet的各個子產品所在檔案

|   `– hello   #hello子產品

|       |– files    #該子產品對應的檔案資源,可能是要發送給slave的配置檔案等

|       |   `– hello.c

|       `– manifests   #子產品的manifest檔案

|           `– init.pp                  #子產品入口檔案

`– ssl       #puppet的證書檔案目錄

(2)    程式執行流程

代碼調用順序是:

Slave發起連接配接請求 à site.pp à nodes àmodules à init.pp

首先,slave向發起master連接配接請求,進行證書驗證;

接着,證書驗證通過後,master會直接找到入口檔案manifests目錄下的site.pp檔案,該檔案可能包含一些全局變量,參數預設值(當各個子產品沒有設定這些參數時,它們的預設值)以及其它pp檔案的調用(在該例子中,會調用modules.pp和nodes下的各個pp檔案);

然後,master通過nodes下的各個pp檔案定位到該slave要執行的子產品(init.pp是各個子產品的入口),彙總這些子產品代碼傳回給slave;

最後,slave根據master發過來的manifest,配置資訊。

(3)    代碼解釋

直接在此處下載下傳代碼。

5.2   一個更複雜的執行個體

本節介紹了一個更為複雜的某個公司正在使用執行個體,puppet代碼布局與上一個執行個體一緻,隻不過該執行個體涉及到更多子產品,更複雜的依賴管理。代碼具體内容本節就不解釋了,具體參見代碼。

6.  可能遇到的問題

Q: puppet的證書機制

A: puppet證書問題是初學者最容易遇到的問題,這裡講一下怎麼處理。puppet伺服器端在安裝或者首次啟動的時候,會自動生産一個根證書和伺服器證書,證書和主機名相關,是以如果證書生成後友改了主機名,那就會出問題。 puppet用戶端在首次啟動的時候,也會自動生成證書;但是這個證書需要得到puppet伺服器端的簽名才行,是以;puppet用戶端第一次連接配接伺服器的時候,會發送一個證書請求;伺服器端需要對這個證書進行簽名。puppet用戶端在下次連接配接伺服器的時候就會下載下傳簽名好的證書。

Q:Ubuntu下面的證書出錯,怎麼解決?

A:本方法是提供給初學者的測試環境,生成環境不建議這麼做。首先在puppetmaster(伺服器端)删除/var/lib/puppet/ssl目錄;然後啟動puppetmasterd;然後在用戶端也删除/var/lib/puppet/ssl目錄。把puppetmaster機器的主機名和對應的ip位址寫入用戶端機器的/etc/hosts。

然後執行:puppetd –test –server server.example.com. 把server.example.com替

換成你自己的伺服器主機名。 執行這個指令,會有提示資訊,不用理會。

然後登入到puppetmaster伺服器機器,執行puppetca –list 指令,看看是否有用戶端的證書請求;如果沒有,請檢查前面的步驟是執行正确,以及網絡連接配接是否正常。 如果puppetca –list 能看到請求,那麼執行puppetca -s -a 指令;對所有的證書請求簽名。最後回到puppet用戶端機器,執行

puppetd –test –server server.example.com.

就能建立連接配接了,如果你的site.pp寫好了.就可以測試puppet了。

補充:如果用戶端和伺服器端的時間不一緻也會導緻證書認證失敗,是以出現證書問題的時候需要檢查兩台機器的時間是否一緻,如果不一緻用date指令或者ntpdate指令讓兩台機器的時間一緻。

Q:出現錯誤[Puppet Users] err: Could not retrieve catalog; skipping run

A:可能是由于安裝了兩個版本的ruby或者facter的原因,解決方案見:

https://projects.puppetlabs.com/issues/5279

7.  總結

随着伺服器叢集規模越來越大,自動化配置和部署這些伺服器能夠使管理變得非常容易并大大減小管理部署成本,因而得到IT公司的高度重視。

本文檔介紹了puppet,一種新型的軟體自動化配置和部署工具。本文主要内容涉及puppet的架構,安裝和使用方法,并給出了兩個使用執行個體。

在大規模的生成環境中,如果隻有一台puppetmaster會忙不過來的,因為puppet是用ruby寫的,ruby是解析型語言,每個用戶端來通路,都要解析一次,當用戶端多了就忙不過來,是以需要擴充成一個伺服器組。puppetmaster可以看作一個web伺服器,實際上也是由ruby提供的web伺服器子產品來做的。是以可以利用web代理軟體來配合puppetmaster做叢集設定,具體參見:http://puppet.wikidot.com/puppetnginx 。

8.  參考資料

puppet官方網站:http://www.puppetlabs.com/

puppet中文wiki:http://puppet.chinaec2.com/

puppet中文部落格:http://www.comeonsa.com

9.  代碼下載下傳

繼續閱讀