puppet安裝配置和測試

前序:關於puppet
0.1puppet的工作原理:
Puppet 的工作細節分成如下幾個步驟:
1、客戶端puppetd 調用facter,facter 會探測出這臺主機的一些變量如主機名、內存大小、IP 地址等。然後puppetd 把這些信息發送到服務器端。
2、服務器端的puppetmaster 檢測到客戶端的主機名,然後會到manifest 裏面對應的node 配置,然後對這段內容進行解析facter 送過來的信息可以作爲變量進行處理的,node 牽涉到的代碼才解析,其它的代碼不不解析,解析分幾個過程:語法檢查、然後會生成一箇中間的僞代碼,然後再把僞代碼發給客戶機。
3、客戶端接收到僞代碼之後就會執行,客戶端再把執行結果發送給服務器。
4、服務器再把客戶端的執行結果寫入日誌。
0.2設計架構
puppet是基於c/s架構的。服務器端保存着所有對客戶端服務器的配置代碼,在puppet裏面叫做manifest。客戶端下載manifest之後,可以根據manifest對服務器進行配置,例如軟件包管理,用戶管理和文件管理等等。
puppet工作過程中有兩點值得注意。第一,爲了保證安全,client和master之間是基於ssl和證書的,只有經master證書認證的client可以與master通信;第二,puppet會讓系統保持在你所期望的某種狀態並一直維持下去,如檢測某個文件並保證其一直存在,保證ssh服務始終開啓,如果文件被刪除了或者ssh服務被關閉了,puppet下次執行時(默認30分鐘),會重新創建該文件或者啓動ssh服務。

第一章:puppet的安裝

1.1準備工作
先設置好主機名,因爲puppet的服務端和客戶端的認證是靠主機來生成認證文件的,所以主機名的設置很重要。本實驗主機名設置如下:
服務端:server.puppet.com
客戶端:client.puppet.com
然後要調整客戶端和服務端時間同步,可以在服務端建立ntp服務端,然後讓客戶端做時間同步,我是直接設置的日期,相差不會太就可以。
接着要設置hosts文件,要在服務端和客戶端都設置,本實驗設置如下:
服務端和客戶端的host文件一樣,vim /etc/hosts:
192.168.0.236 server.puppet.com
192.168.0.234 clietn.puppet.com

1.2安裝puppet服務端和客戶端
下邊開始安裝puppet的客戶端和服務端。可以用yum安裝,可以源碼安裝,這兩個安裝的方法我都測試了,但是客戶端和服務端版本之間的兼容沒有測試。儘量用一樣的版本吧。先介紹用yum安裝的方法:
centos的官方軟件庫裏面不包含puppet包,但是在epel項目裏面有包含puppet包. epel 是一個對rhel軟件倉庫的擴展,把一些有用的,但是rhel庫沒包含的軟件收集在一起做成的一個軟件倉庫. 因此首先在centos上面安裝epel:
rpm –Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
接着可以直接用安裝puppet,
服務端:yum install puppet-server
客戶端:yum install puppet
再簡單說一下編譯安裝:
因爲puppet是有ruby語言寫的,所以要先安裝ruby。這個直接可以yum安裝。
yum install ruby
源碼包安裝的話服務端和客戶端的安裝操作是一樣的,把puppet的客戶端和服務端都安裝了進去,只是在在啓用服務的時候啓用的不一樣,服務端啓用的是puppetmaster,客戶端啓用的是puppetd。接着先在下邊的地址上下載相應的源碼包,包括facter和puppet。http://projects.reductivelabs.com/projects/puppet/wiki/Downloading_Puppet
本實驗下載的是puppet-0.25.2.tar.gz.tar.gz和puppet-0.25.2.tar.gz。
tar zxvf facter-1.5.8.tar.gz
cd puppet-0.25.2.tar.gz
ruby install.rb

再安裝puppet
tar zxvf puppet-0.25.2.tar.gz
cd puppet-0.25.2.tar.gz
ruby install.rb

錯誤總結:
第一次認證的時候報下邊的錯誤:
[root@client ~]# puppetd --server server1.puppet.com --test
err: Could not retrieve catalog from remote server: certificate verify failed
我做測試發現的原因有三種:
第一:是hostname沒有設置好,在安裝前一定要把hostname設置好,設置好之後儘量重啓機器。實在不行就刪了重新安裝。
第二:時間不同步,時間不同步也會報認證失敗的錯誤,可以用date設置時間,只要不是差得太多就沒事。
第三:是ssl的問題,在你用的這個客戶端puppet已經做過其他的機器的客戶端的情況下,因爲已經生成的有證書,可能會和現在的衝突,把/var/lib/puppet/ssl這個文件夾刪掉之後就行了。

1.3配置c/s模式的puppet的實驗環境
Puppet的的客戶端和服務端是靠ssl鏈接的,在服務端有一個自簽名的根證書,在安裝軟件的時候自動生成。每個客戶端的證書要經過根證書籤名才能和服務器連接。所以首先要在客戶端執行下面的命令來請求服務器簽名證書。
puppet --server server.puppet.com --test
執行上面的命令,客戶端將生成證書,並且把證書籤名請求發到服務器端。登錄到服務
器端,執行下面的命令查看是否有客戶端的證書請求:
puppetca –list 這個查看沒有簽名的證書
client.puppet.com
如果看到了客戶端的證書請求,用下面的命令對所有證書請求籤名:
puppetca –s client.puppet.com
或者puppetca -s –a 這條命令是對所有爲簽名的請求籤名。
簽過名之後可以看到:
[root@server ~]# puppetca --list --all
+ client.puppet.com (B2:9D:E5:CB:7A:4A:09:CD:33:44:25:BF:1B:C3:FA:56)
+ server.puppet.com (8F:FE:EE:AB:1E:E8:BA:52:7F:30:59:6A:94:84:05:87)
如果出現這些就說明簽名完成。
服務端:
[root@server ~]# md5sum /var/lib/puppet/ssl/ca/signed/client.puppet.com.pem
f833cbbd129456d3e4df5daec0b612b8 /var/lib/puppet/ssl/ca/signed/client.puppet.com.pem
客戶端:
[root@client ~]# md5sum /var/lib/puppet/ssl/certs/client.puppet.com.pem
f833cbbd129456d3e4df5daec0b612b8 /var/lib/puppet/ssl/certs/client.puppet.com.pem
上邊揭黑部分的兩串代碼相同,說明客戶端和服務端的認證簽名完成。
注意:
如果想重新生成簽名可以先在服務端用puppetca –clean client.puppet.com清除服務端的證書,然後在客戶端刪除/var/lib/puppet這個文件夾,刪除之後再認證的話可以重新生成這個文件夾。

1.4puppet客戶端和服務端的啓動和調試
服務端的啓動:
Yum安裝的:service puppetmaster start
編譯安裝的:service puppetmasterd start
或者 /usr/bin/ruby /usr/sbin/puppetmasterd
客戶端啓動:service puppet start
如果服務端和客戶端按上述方法啓動,每個半個小時,會進行一次自動同步。

下邊說調試的時候用到的兩個命令:
服務端:puppetmasterd -d --no-daemonize -v –trace 這個命令可以看到服務端的和客戶端同步的信息,注意的是用這個的時候puppetmaster是沒開的。
客戶端:puppet --server server.puppet.com –test 用這個命令來同步服務端對客戶端的配置

第二章:puppet的使用方法

2.1:資源
資源屬性
before
用於控制不同對象(資源)的執行順序關係,表示某個對象(資源)在另一個對象之後發生(require與之相反,它表示之前發生)。
subscribe
檢測某個資源,當它發生變化時,該資源會重新加載。需要注意的是,目前支持subscribe的資源只有exec,service和mount。
 

name
指定了要對那個文件操作,默認情況下,name都等於title,所以很多時候name是可以省略的。但是name卻可以通過判定操作系統自己選擇合適的值。看下邊的例子:

  1. file { 
  2. "proftp": 
  3. name => "/usr/local/etc/proftpd.conf", 
  4. source => "puppet://$fileserver/proftp/proftpd.conf", 
這樣的話,別的資源在引用的時候就可以可以直接用proftp,不用寫長長的路徑了。

alias
給資源的title一個別名,這樣在引用的時候就可以直接用alias後邊的名字,對一些別名比較長的,代碼可以簡化很多。看下邊的例子:

  1. file { 
  2. "/usr/local/etc/proftpd.conf": 
  3. source => "puppet://$fileserver/proftp/proftpd.conf", 
  4. alias => "proftp" 

 

資源:
常用的資源主要有以下幾個:
file:文件管理
package:軟件包管理
service:系統服務管理
cron:配置定時任務
exec:運行shell命令
定義一個資源,需要指定資源的類型和title。看下例:
 

  1. file { 
  2. “/etc/password”: 
  3. name => “/etc/passwd”, 
  4. owner => root, 
  5. group => root, 
  6. mode => 644; 
  7. 上邊代碼:file是指定資源的類型,第二行的”/etc/password”是資源的title,title的作用是讓puppet能唯一識別這個資源。後邊的三個就不用說了。 

下一個例子:

  1. file { 
  2. "/etc/ssh/sshd_config": 
  3. mode => 0644, owner => root , group => root, 
  4. source => puppet://$fileserver/ssh/sshd_config ", 
  5. Service { 
  6. “sshd”: 
  7. subscribe => File[/etc/sshd/sshdconfig], 


上邊代碼第二行和第三行已經解釋過了,第四行soucrce的意思是指定文件的來源,指定的來源是puppet://$fileserver/ssh/sshd_config.sarge或者puppet://$fileserver/ssh/sshd_config.etch,$fileserver這個變量應該是事先定義好的,一般是在主配置文件的site.pp中定義,後邊的ssh是在/etc/puppet/fileserver.conf中定義的。下邊的service也是作爲一種資源,subscribe檢測某資源,當它發生變化的時候,該資源會重新加載。後邊的file是引用上邊的,file的第一個字母必須要大寫。

再看一個例子:

  1. package { "ntp": 
  2. ensure => installed, 
  3. service { "ntpd": 
  4. ensure => "running", 
  5. require => Package["ntp"], 
上邊的例子第一部分是說安裝ntp這個包,用的yum安裝的,下邊的require是說這個服務依賴於ntp包的安裝。

2.2類
類的作用是把一組資源收集在一個盒子裏面,一起使用,例如把sshd和他的配置文
件做成一個ssh類:
 

  1. class sshd { 
  2. file { 
  3. "/etc/ssh/sshd_config": 
  4. mode => 0644, owner => root , group => root, 
  5. source => "puppet://$fileserver/ssh/sshd_config", 
  6.  
  7. service { "sshd": 
  8. ensure => running, 
  9. subscribe => File["/etc/ssh/sshd_config"], 


這樣在調用的時候就可以很方便。
2.3節點:
puppet如何區分不同的客戶端,並且給不同的服務端分配manifest呢?puppet使用node資源做這件事情,node 後面跟客戶端的主機名,例如:

  1. node 'client.puppet.com' { 
  2. include ntp,vsftpd,sshd 


2.4變量和數組
puppet也和其他語言一樣,支持變量和數組,puppet用$符號定義變量,變量的內容
用雙引號括起來。例如:
$fileserver = "server.puppet.com"
puppet利用方括號來定義數組,數組的內容由逗號分割,例如下面的例子:

  1. [ "apache2" , " httpd " , " ssh " ] 

2.5模塊
一個模塊就是一個/etc/puppet/modules目錄下面的一個目錄和它的子目錄,在puppet的主文件site.pp裏面用
import “modulename”
通過引入模塊,可以結構化代碼,便於分享和管理,比如關於apache的所有配置都寫到apache模塊下面。一個模塊目錄下面通常包括三個目錄:files, manifests, templates。
manifests 裏面必須要包括一個init.pp的文件,這是該模塊的初始(入口)文件,導入一個模塊的時候,會從init.pp開始執行。可以把所有的代碼都寫到init.pp裏面,也可以分成多個pp文件,init 再去包含其他文件。
files目錄是該模塊的文件發佈目錄,puppet提供一個文件分發機制,類似rsync的模塊。
templates 目錄包含erb模型文件,這個和file資源的template屬性有關。
puppet安裝好以後,modules目錄是沒有的,自己建立一個就行,然後在裏面可以新增加你的模塊。
2.6 puppet配置文件結構樹參考

1、所有的配置文件最後都要被主site.pp引用。
主線是:1 class目錄下的類.pp=>服務的主配置文件init.pp=>引用模塊的mudule.pp
2 node文件夾下服務器分組node節點.pp(例如C.pp)=>node文件夾下site.pp
3 主配置site.pp把1的mudule.pp 和2的node文件夾下site.pp 去“ import”。
2、但是site.pp,不是唯一的,我們可以建無數的site.pp,需要在/etc/puppet/manifests目錄下

2.7編程實例:
根據這個思路,我們來建立一個ssh模塊。

mkdir –p /etc/puppet/modules/sshd/manifests
mkdir –p /etc/puppet/modules/sshd/files

vim /etc/puppet/ fileserver.conf

  1. [ssh] 
  2. path /etc/puppet/modules/sshd/files 
  3. allow 192.168.0.0/24 
  4.  
  5. vim /etc/puppet/modules/sshd/manifests/init.pp 
  6. class sshd { 
  7. file { 
  8. "/etc/ssh/sshd_config": 
  9. mode => 0644, owner => root , group => root, 
  10. source => "puppet://$fileserver/ssh/sshd_config", 
  11.  
  12. service { "sshd": 
  13. ensure => running, 
  14. subscribe => File["/etc/ssh/sshd_config"], 

cp /etc/ssh/sshd_config /etc/puppet/modules/sshd/files/

vim /etc/puppet/manifests/site.pp

  1. $fileserver = "server.puppet.com" 
  2. import "modules.pp" 
  3. import "nodes.pp" 
  4.  
  5. vim /etc/puppet/manifests/modules.pp 
  6. import "sshd" 
  7.  
  8. vim /etc/puppet/manifests/nodes.pp 
  9. node 'client.puppet.com' { 
  10. include sshd 


注意:
使用節點的時候,儘量把所有的配置寫成類,節點裏面定義好變量和包含相應的類就可以了。保證代碼的簡潔。


對file類型title的測試:

  1. file { 
  2. "/var/proftp": 
  3. recurse => "true" 遞歸檢索 
  4. source => "puppet://$fileserver/proftp/proftpd/autoproftp", 


如果source後邊跟的是文件,那麼執行之後客戶端上這個文件的名字就是title。
如果source後邊跟的是目錄,要拷貝目錄下的內容,應該加上recurse => "true",的結果是把把source指定的目錄下的所有內容,拷貝到title目錄下的。如果不用
recurse => "true"這個,客戶端只會增加一個title這樣的目錄,裏邊沒有內容。
如果客戶端有title這目錄或者文件的話,和服務端的source衝突的話,執行結果是不拷貝source源的內容到客戶端。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章