puppet完全攻略(一)puppet應用原理及安裝部署

weixin_34115824發表於2017-11-15

 

puppet簡介
  
puppet官方網站:http://www.puppetlabs.com/
puppet中文wiki:http://puppet.chinaec2.com/
puppet中文論壇:http://www.puppetfans.com/
 
puppet是一種Linux、Unix平臺的集中配置管理系統,所謂配置管理系統,就是管理機器裡面諸如檔案,使用者,程式,軟體包這些資源,其設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係
 
puppet使用一種描述性語言來定義配置項,配置項中被稱為”資源”,描述性語言可以宣告你的配置的狀態---比如宣告一個軟體包應該被安裝或者一個服務應該被啟動
用puppet,可以執行一個伺服器端,然後每個客戶端通過ssl證書連線伺服器,得到本機器的配置列表,然後更加列表的來完成配置工作,所以如果硬體配置好,在一天之內配置好上千上萬臺機器是很容易實現的事情,前提得大部分機器配置類似
在大規模的生成環境中,如果只有一臺puppetmaster會忙不過來的,因為puppet是用ruby寫的,ruby是解析型語言,每個客戶端來訪 問,都要解析一次,當客戶端多了就忙不過來,所以需要擴充套件成一個伺服器組。puppetmaster可以看作一個web伺服器,實際上也是由ruby提供 的web伺服器模組來做的。因此可以利用web代理軟體來配合puppetmaster做叢集設定
 
puppe專案主要開發者是Luke Kanies,目前是puppet labs CEO,puppet遵循GPLv2版權協議。從1997年開始Kanies參與UNIX的系統管理工作,Puppet的開發源於這些經驗。因為對已有的配置工具不甚滿意,從2001年到2005年間,Kanies開始在Reductive實驗室從事工具的開發。很快,Reductive實驗室釋出了他們的旗艦產品——
 
 
 
來張牛人靚照

與Luke Kanies談Puppet工具:http://article.yeeyan.org/view/neilalaer/4629
 
puppet 系統架構
 
Puppet是開源的基於Ruby的系統配置管理工具,puppet是一個C/S結構, 當然,這裡的C可以有很多,因此,也可以說是一個星型結構. 所有的puppet客戶端同一個伺服器端的puppet通訊. 每個puppet客戶端每半小時(可以設定)連線一次伺服器端, 下載最新的配置檔案,並且嚴格按照配置檔案來配置伺服器. 配置完成以後,puppet客戶端可以反饋給伺服器端一個訊息. 如果出錯,也會給伺服器端反饋一個訊息. 下圖展示了一個典型的puppet配置的資料流動情況
 
puppet工作流程
 

1)         客戶端通過facter收集客戶端資訊併傳送至服務端
2)         連線服務端並請求catalog日誌
3)         請求節點(node)的資訊
4)         從伺服器端接收節點(node)的例項
5)         編譯程式碼(包括語法檢查等工作)
6)         查詢是否有exported 虛擬資源
7)         如有,則從資料庫接收虛擬資源
8)         接收完整的catalog日誌
9)         儲存catalog日誌到資料庫
10)       客戶端接收完整的catalog日誌
 
實驗效果圖:
 

 
實驗環境:
puppetmaster   192.168.50.55      server.viong.com
puppet         192.168.50.56      client1.viong.com
 
centos x64 5.5     最小化安裝+ Developtool
 
安裝步驟:
 
由於centos最小化安裝,需要yum一些常用工具
 
 
安裝NTP同步時間,統一master和client上的時間
crontables(用來安裝、卸裝、或列舉用來驅動 cron 守護程式的表格的程式)預設是安裝的,可vixie-cron軟體包是cron的主程式
wget下載安裝檔案
VI只預設安裝了vim-minimal-7.x,所以無論是輸入vi或者 vim檢視檔案,syntax功能都無法正常啟用。因此需要用yum安裝另外兩個元件:vim-common-7.x和vim-enhanced- 7.x ,yum vim-enhanced-會自動下載關聯vim-common
telnet只安裝client,便於測試網路連通性
 
[root@puppet soft]# chkconfig --level 35 ntpd on
[root@puppet soft]# crontab -e
# 加入這一行: 
10 5 * * * root /usr/sbin/ntpdate time.nist.gov ; /sbin/hwclock –w
#每天凌晨5點10分同步time.nist.gov,並將 Linux 時間寫入 BIOS時
 
[root@localhost ~]# service crond restart
[root@localhost ~]# ntpdate pool.ntp.org; hwclock –w
29 Feb 15:22:47 ntpdate[15867]: step time server 196.25.1.1 offset 98.750417 sec
Puppet 要求所有機器有完整的域名(FQDN),如果沒有 DNS 伺服器提供域名的話,可以在兩臺機器上設定主機名(注意要先設定主機名再安裝 Puppet,因安裝 Puppet 時會把主機名寫入證書,客戶端和服務端通訊需要這個證書):
 
[root@puppet puppet-2.7.14]#echo "192.168.50.56 client1.viong.com" >>/etc/hosts
[root@puppet puppet-2.7.14]#hostname server.viong.com
[root@puppet puppet-2.7.14]# vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=server.viong.com
GATEWAY=192.168.50.1
--------------------------------------------------------------------------------------------------預設DNS設定過,個別童鞋有報錯無法認證記得查詢一下
[root@puppet puppet-2.7.14]#vi /etc/resolv.conf
; generated by /sbin/dhclient-script
#search localdomain        #註釋掉這行,不然造成後面無法認證
nameserver 8.8.8.8
修改完以上檔案,退出重新登入
-------------------------------------------------------------------------------------------------- 
安裝ruby
 
由於puppet是由ruby語言編寫,所以要安裝ruby環境及庫檔案,命令幫助檔案
 
[root@puppet soft]# yum install ruby ruby-libs ruby-rdoc 
 
安裝facter
 
puppet資源下載點 http://downloads.puppetlabs.com/ 
 
facter是一個系統盤點工具,收集主機的一些資料,比如CPU,主機IP等,它收集到值傳送給puppet伺服器端,伺服器端就可以根據不同的條件來對不同的節點機器生成不同的puppet配置檔案
 
安裝puppet之前必須先安裝facter
 
[root@puppet soft]# tar -zxvf facter-1.6.8.tar.gz
[root@puppet soft]# cd facter-1.6.8 
[root@puppet facter-1.6.8]# ruby install.rb
 
安裝puppet
 
[root@puppet facter-1.6.8]# cd ..
[root@puppet soft]# wget http://downloads.puppetlabs.com/puppet/puppet-2.7.14.tar.gz
[root@puppet soft]# tar -zxvf puppet-2.7.14.tar.gz
[root@puppet soft]# cd puppet-2.7.14
[root@puppet puppet-2.7.14]# ruby install.rb
 
複製配置檔案
 
[root@puppet puppet-2.7.14]# cp conf/redhat/fileserver.conf /etc/puppet/
[root@puppet puppet-2.7.14]# cp conf/redhat/puppet.conf /etc/puppet/
[root@puppet puppet-2.7.14]# cp conf/redhat/server.init /etc/init.d/puppetmaster
 
設定puppetmaster為服務,並自動啟動
 
確認puppetmaster是否有執行許可權
[root@puppet puppet-2.7.14]# ll /etc/init.d/puppetmaster
-rwxr-xr-x 1 root root 3936 06-05 18:19 /etc/init.d/puppetmaster
[root@puppet puppet-2.7.14]# chkconfig --add puppetmaster
[root@puppet puppet-2.7.14]# chkconfig --level 35 puppetmaster on
 
建立puppet帳號
 
 
1)確認是否生成清單資料夾
[root@puppet soft]# ll /etc/puppet/
總計 32
-rw-r--r-- 1 root root 2552 06-05 01:29 auth.conf
-rwxr-xr-x 1 root root 381 2012-06-05 fileserver.conf
drwxr-xr-x 2 root root 4096 2012-06-05 manifests
-rwxr-xr-x 1 root root 853 2012-06-05 puppet.conf
manifests目錄:用來存放puppet的指令碼檔案的,必須包含init.pp檔案,通常情況下可以把指令碼都寫入到這個一個檔案中,但為了便於管理,最好是按照功能或者專案分開存放
2)確認系統生成puppet使用者
 
[root@puppet puppet-2.7.14]# cat /etc/passwd |grep puppet
puppet:x:500:500::/home/puppet:/bin/bash
 
3)保證/var/lib/puppet/rrd目錄存在且屬主是puppet
 
[root@puppet puppet-2.7.14]# ll /var/lib/puppet/
總計 72
drwxr-x--- 2 puppet puppet 4096 06-05 18:49 bucket
drwxr-xr-x 2 root   root   4096 06-05 18:49 facts
drwxr-xr-x 2 root   root   4096 06-05 18:49 lib
drwxr-x--- 2 puppet puppet 4096 06-05 18:49 reports
drwxr-x--- 2 puppet puppet 4096 06-05 18:49 rrd
drwxr-x--- 2 puppet puppet 4096 06-05 18:49 server_data
drwxrwx--x 8 puppet root   4096 06-05 18:50 ssl
drwxr-xr-t 2 root   root   4096 06-05 18:49 state
drwxr-x--- 2 puppet puppet 4096 06-05 18:49 yaml
檢視是否安裝成功
 
[root@server ~]# netstat -ntpl|grep 8140
tcp        0      0 0.0.0.0:8140                0.0.0.0:*                   LISTEN      2993/ruby [root@server ~]# ps -ef|grep puppet|grep -v grep
puppet    2993     1 0 10:57 ?        00:00:00 /usr/bin/ruby /usr/sbin/puppetmasterd 
iptable安全設定
 
預設iptable配置如下:
 
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
修改為:
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
 
客戶端
[root@puppet puppet-2.7.14]# echo "192.168.50.55 server.viong.com" >>/etc/hosts
[root@puppet puppet-2.7.14]#hostname client1.viong.com
[root@puppet puppet-2.7.14]# vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME= client1.viong.com
GATEWAY=192.168.50.1
在客戶端安裝ruby facter puppet的步驟參考服務端配置
 
特別說明:請注意客戶端和伺服器端版本要一致。如果版本不一致的話,那麼高版本的只能是puppet server,另一臺只能作為puppet客戶端,也就是說puppet 服務端的版本可以大於或者等於客戶端版本,不可以小於
其中區別一些如下
[root@puppet puppet-2.7.14]# cp conf/redhat/client.init /etc/init.d/puppet
[root@puppet puppet-2.7.14]# chkconfig --level 35 puppet on
[root@puppet puppet-2.7.14]# puppetd --mkusers   
Could not prepare for execution: Got 1 failure(s) while initializing: change from absent to present failed: Could not create user puppet: Execution of '/usr/sbin/useradd -g puppet -M puppet' returned 6: useradd: unknown group puppet
#手動建立puppet使用者與組
 
[root@puppet puppet-2.7.14]# groupadd puppet;useradd -g puppet -M puppet
[root@puppet puppet-2.7.14]# service puppet start
 
測試解析與puppetmaster埠是否暢通
 
[root@puppet puppet-2.7.14]# telnet server.viong.com 8140
Trying 192.168.50.55...
Connected to server.viong.com.
Escape character is '^]'.
Connection closed by foreign host
[root@client1 puppet-2.7.14]# puppetd --test --server server.viong.com
 
info: Creating a new SSL key for client1.viong.com
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for ca
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
info: Creating a new SSL certificate request for client1.viong.com
info: Certificate Request fingerprint (md5): 6F:6A:45:D9:14:28:D1:5B:05:3B:4F:0B:9A:51:D1:71
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
Exiting; no certificate found and waitforcert is disabled
# puppetd --test --server server.viong.com命令是指puppetd 從 server.viong.com去讀取
puppet配置檔案. 第一次連線,雙方會進行ssl證書的驗證,這是一個新的客戶端,在伺服器端那裡還沒有被認證,因此需要在伺服器端進行證書認證
 
以下這步批准證書是在服務端操作
 
檢視當然待批准證書列表
[root@server ~]# puppetca –l
client1.viong.com (B0:85:72:E6:7D:63:EA:CC:BD:0C:E4:F1:70:89:24:70)
批准當前證書
[root@server ~]# puppetca -s client1.viong.com
notice: Signed certificate request for client1.viong.com
notice: Removing file Puppet::SSL::CertificateRequest client1.viong.com at
'/var/lib/puppet/ssl/ca/requests/client1.viong.com.pem'
檢視驗證簽名,注意前面的+號,說明已經簽名
[root@server ~]# puppetca -a --list
+ server.viong.com (43:33:D3:A0:26:C4:E9:89:66:A6:DC:54:20:90:E9:4D) (alt names:
DNS:puppet, DNS:puppet.viong.com, DNS:server.viong.com)
--------------------------------------------------------------------------------------------------
如果要批准全部證書
puppetca -s -a
也可以在puppetmaster端的puppet.conf加入這行:
autosign = true
服務端就自動簽證書
--------------------------------------------------------------------------------------------------
回到客戶端操作,從服務端取回已批准的證書
[root@client1 puppet-2.7.14]# puppetd --test --server server.viong.com
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for client1.viong.com
info: Caching certificate_revocation_list for ca
info: Caching catalog for client1.viong.com
info: Applying configuration version '1338897814'
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.02 seconds
 
驗證證書是否正確
服務端:
[root@server ~]# md5sum /var/lib/puppet/ssl/ca/signed/client1.viong.com.pem
8529a6f2d42c1b492c016fe870b744b6 /var/lib/puppet/ssl/ca/signed/client1.viong.com.pem
客戶端:
[root@client1 puppet-2.7.14]# md5sum /var/lib/puppet/ssl/certs/client1.viong.com.pem
8529a6f2d42c1b492c016fe870b744b6 /var/lib/puppet/ssl/certs/client1.viong.com.pem
------------------------------------------------------------------------------------------------
出現修改主機名問題引起無法認證,需要重新申請證書,操作以下兩個步驟:
服務端:
[root@server ca]# rm -rf /var/lib/puppet/ssl/ca/signed/client1.viong.com.pem
客戶端:
[root@client1 puppet-2.7.14]# rm -rf /var/lib/puppet/ssl/ 
 ------------------------------------------------------------------------------------------------
功能測試
服務端:
建立pp檔案測試
puppet的第一個執行的程式碼是在/etc/puppet/manifest/site.pp
因此這個檔案必須存在,而且其他的程式碼也要通過程式碼來呼叫.
[root@server ~]# vim /etc/puppet/manifests/site.pp
node default {
file {"/tmp/viong.txt":
content=>"good,test pass!\n";}
上面的程式碼對預設連入的puppet客戶端執行一個操作,在/tmp目錄生成一個viong.txt檔案,內容是good,test pass! 並自動回車換行
初次建立pp檔案,需要重啟puppetmaster
[root@server ~]# service puppetmaster restart    
停止 puppetmaster:                                        [確定]
啟動 puppetmaster:                                        [確定]
客戶端:
[root@client1 puppet-2.7.14]# puppetd --test --server server.viong.com
info: Caching catalog for client1.viong.com
info: Applying configuration version '1338897814'
notice: /Stage[main]//Node[default]/File[/tmp/viong.txt]/ensure: defined content as '{md5}9a3f5438e1d35a72d853974203de4254'
notice: Finished catalog run in 0.03 seconds
成功的話就會顯示puppet反饋一些除錯資訊,並在/tmp目錄下建立了 /tmp/viong.txt檔案.
[root@client1 puppet-2.7.14]# cat /tmp/viong.txt
good,test pass!
==============================================================
設定客戶端的守護程式
info: Caching catalog for client1.viong.com
info: Applying configuration version '1338897814'
notice: Finished catalog run in 0.03 seconds
--server 服務端FQDN –-verbose 輸出冗餘資訊 –-waitforcert 超時100
 
本人覺得使用cron或者手動執行puppet比較符合需求,或者以指令碼方式,當master有改變再執行編寫的指令碼 
先整理到這裡,資源管理這塊涉及到很多內容需要花時間慢慢咀嚼.
整理一篇文章挺辛苦,這次釋出遇到一些問題,謝謝邵程程幫忙解決了,有問題請大家提出來,謝謝
 
參考文件:
http://www.slideshare.net/myw58/puppet-7159486
愛好puppet研究可以加sky 釋出 puppet QQ群:179750784 



    本文轉自viong 51CTO部落格,原文連結:http://blog.51cto.com/viong/890553,如需轉載請自行聯絡原作者



相關文章