伺服器:10.1.20.154 ~ 155,RHEL 5.4
puppet伺服器端:10.1.20.154 test_1.com
puppet用戶端:10.1.20.155 test_2.com
一、概況
Puppet基于C/S架構,伺服器端儲存着用戶端的所有配置代碼,稱為manifest,用戶端下載下傳manifest後,根據其内容對本機進行配置,如軟體的安裝、檔案的管理、使用者的管理等。
Uinux/Linux裡的軟體、使用者、檔案以及crontab等,在puppet裡統一稱之為“資源”,每種資源都有其對應的屬性,如檔案資源的權限屬性,一些資源的共有屬性稱為元屬性。manifest裡的代碼主要由這些資源和資源的屬性構成。
從puppet 2.6.0開始,puppet簡化了可執行指令,使用puppet + subcommand的方式來完成所有的操作。如:puppetmasterd用puppet master替代,puppetd用puppet agent替代等等,這樣一來,指令的作用非常明确,從字面意思就可以看出來。可使用指令puppet help檢視詳細用法。
這種變化也反應到了puppet配置檔案puppet.conf中,如:關于master的配置被寫入[master]配置段中,關于agent的配置被寫入[agent]配置段中等等。
puppet配置檔案目錄預設是/etc/puppet,檔案名為puppet.conf,檔案中包含多個配置段,配置段中包含一系列縮進過的 setting = value行。
配置段包括:
[main]:始終生效,但是其中的設定可以被後面配置段中相同的設定覆寫掉
[agent]:對puppet agent生效
[master]:對puppet master和puppet cert生效
[user]:僅對puppet aply模式生效,一般可能用不到
生成預設配置檔案:
puppet master --genconfig >puppet.conf
puppet agent --genconfig >puppet.conf
二、Puppet元件:
Puppet:主程式,依賴軟體Ruby、Facter;
Facter:主機資料收集器,把收集到的主機資料發送給puppet master;
Dashboard: Puppet圖形管理界面,可選元件,要求Ruby 1.8.7;
MCollective:Puppet排程器,可選元件,解決多個agent同時向master請求時造成的性能下降問題,需要中間件的支援,可選擇rabbitmq或activemq。
三、安裝:
Puppet版本:2.7.19,Facter版本:1.6.13,Ruby版本:1.9.3;
這裡忍不住要說一下,最開始看官方網站,隻說puppet dashboard要求ruby >1.8.6,後來等到我準備安裝dashbaord時,仔細看了一下manual,才發現它要求ruby版本是1.8.7,而使用ruby 1.9.x會有問題,這也太他媽坑爹了。但我也懶得重新搞,是以放棄了dashboard。
ruby 1.8.7是08年放出的,到現在都4年了,生命周期即将終結,ruby開發團隊已經停止對該版本的維護了。但很多ruby的周邊軟體要麼是08年釋出的,到現在沒有更新過,要麼是跟ruby 1.9.x有沖突。這方面的例子不單單隻有dashboard和mongrel。我對ruby的印象非常的不好,每月的程式設計語言排行榜上,ruby基本上每次都是前十名墊底,這不是沒有道理的。
根據puppet的README.md,ruby 1.8.5、1.8.7和1.9.2經過了puppet官方測試,其它版本要自行承擔風險。但由于1.9.3修複了之前版本的很多漏洞,我還是決定使用ruby最新版本。
因為虛拟機不能連網,隻能使用源碼安裝的方式,所有軟體先下載下傳到本地然後上傳到伺服器。
大緻過程:修改主機名,時間同步,添加防火牆,添加puppet使用者,安裝依賴,安裝puppet。
用戶端與伺服器端執行相同的操作。
時間同步:略,SSL認證時需要。
修改主機名及host表:略, Puppet證書需要。
注: Puppet證書使用的主機名必須是FQDN(完全合格域名/全稱域名),即主機名+域名的格式。
使用者名添加:useradd -M -s /sbin/nologin puppet
依賴安裝: ruby、facter,ruby需要YAML庫的支援。
yaml安裝:
yaml是一種語言,而libyaml庫是yaml的C語言實作。參考:http://zh.wikipedia.org/zh-cn/YAML和http://pyyaml.org/wiki/LibYAML
tar -xf yaml-0.1.4.tar.gz && cd yaml-0.1.4
./configure && make && make install
echo '/usr/local/yaml/lib' >/etc/ld.so.conf.d/libyaml.conf
ldconfig
注:configure時沒有指定--prefix,因為如果指定,在安裝完ruby,使用gem時,如gem -v或使用gem安裝軟體時會提示錯誤:
/usr/local/ruby-1.9/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby。
openssl安裝:
tar -xf openssl-1.0.1c.tar.gz && cd openssl-1.0.1c
./config --prefix=/usr/local/openssl-1.0.1 -fPIC
make && make install
ruby安裝:
tar -xf ruby-1.9.3-p286.tar.gz && cd ruby-*
./configure --prefix=/usr/local/ruby-1.9
make && make install
echo 'export PATH=$PATH:/usr/local/ruby-1.9/bin:/usr/local/ruby-1.9/sbin/' >>/etc/profile
source /etc/profile
facter安裝:
tar –xf facter-1.6.13.tar.gz && cd facter-*
ruby install.rb
facter安裝時可能遇到的錯誤:
Could not load openssl Ruby library; cannot install
解決辦法:進入ruby的源碼目錄下的ext/openssl,執行ruby extconf.rb指令。具體如下:
cd ruby-1.9.3-p286/ext/openssl
ruby extconf.rb --with-openssl-lib=/usr/local/openssl-1.0.1/lib/ --with-openssl-include=/usr/local/openssl-1.0.1/include/
puppet開源版安裝,可以選擇官方網站下載下傳,也可以到github下載下傳,兩個位址如下:
http://puppetlabs.com/misc/download-options/
https://github.com/puppetlabs/puppet
tar -xf puppet-2.7.19.tar.gz && cd puppet-*
cp conf/redhat/* /etc/puppet
四、伺服器端配置:
添加防火牆,用戶端預設使用 tcp 8140端口向伺服器端請求檔案:
iptables -A INPUT -p tcp --dport 8140 -j ACCEPT
生成配置檔案:
puppet master --genconfig >/etc/puppet/puppet.conf
vim /etc/puppet/puppet.conf,修改如下行:
server = test_1.com
注釋掉如下行:
ca_server =
pluginsource =
factsource =
reportserver =
report_server =
inventory_server =
archive_file_server =
測試啟動:puppet master --no-daemonize --verbose
啟動:puppet master
這裡就不要生成system V腳本了,因為生産環境中一般會有nginx或apache放在前端處理用戶端連接配接,然後由nginx或apache調用puppet master,puppet master不需要作為一個獨立程序來運作。
五、用戶端配置及申請證書:
puppet agent --genconfig >/etc/puppet/puppet.conf
生成system V腳本:
cp /etc/puppet/client.init /etc/init.d/puppetclient
vim /etc/init.d/puppetclient,修改如下行:
PATH=/usr/bin:/sbin:/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
puppetd=${PUPPETD-/usr/local/ruby-1.9/sbin/puppetd}
lockfile=${LOCKFILE-/var/lib/puppet/state/puppetdlock} //根據puppet.conf中的配置進行修改
pidfile=${PIDFILE-/var/lib/puppet/run/agent.pid} //根據puppet.conf中的配置進行修改
chmod 755 /etc/init.d/ puppetclient
chkconfig --add puppetclient
chkconfig puppetclient on
service puppetclient start
用戶端申請證書:puppet agent --test,首次運作,可能有報錯,不管。
伺服器端準許證書:puppet cert -s test_2.com 或 puppetca -s -a //給所有請求進行簽名
伺服器端檢視已準許證書:puppet cert-a -l,如果出現’+ ServerName’,說明指定Server已簽名
六、測試
伺服器端/etc/puppet/manifests目錄下添加檔案site.pp,内容如下:
node default {
file { 'test2':
name => '/tmp/test2.txt',
content => "hello,agent!\n"; }
}
用戶端執行puppet agent --test,然後可以看到/tmp目錄下建立出一個test1.txt的檔案。
七、擴充puppet master的處理能力
puppet master預設使用ruby的webrick作為伺服器,這個輕量級的伺服器處理請求的能力有限,是以大多數的正式環境中會用apache或nginx替換它。apache或nginx作為web前端來處理SSL連接配接,這樣後端可以起多個puppet master執行個體,做成一個master負載均衡叢集。
也有人用Mongrel,但感覺ruby不怎麼重視mongrel,對它的支援很不給力,1.1.5版本是08年放出來的,10年放出了一個1.2.0 pre2,此後就沒什麼消息了。mong 1.1.5與ruby 1.9.x不相容,即使mongrel 1.2.0 pre2也不能很好的在ruby 1.9.x上工作。
passenger全稱是Phusion Passenger,原本的名字叫mod_rails,是apache和nginx的一個擴充子產品,目的是為了能夠友善地在apache或nginx上部署rail或rack應用程式,如puppet就是一個标準的rack應用。Phusion Passenger官方網站有一個圖檔,很形象地說明了passenger的用途:
<a href="http://blog.51cto.com/attachment/201212/092122747.jpg" target="_blank"></a>
puppet master負載均衡叢集是一個比較複雜的工程,這裡僅調通nginx + passenger,不做叢集。安裝配置過程可以借簽puppet官方wiki:http://docs.puppetlabs.com/guides/passenger.html,和http://projects.puppetlabs.com/projects/puppet/wiki/Using_Passenger。
在我的虛拟環境中,passenger、nginx和puppet master安裝到同一台機器上:test_1.com。
安裝rubygem:
gem是ruby的一個輔助工具,ruby的一些庫和工具都是依靠gem來安裝的,包括passenger、rake、rack等,都可以通過gem install的方式安裝。其實,gem已經內建到了ruby 1.9.x中,不用再安裝。
安裝rack:
下載下傳位址:http://rubygems.org/gems/rack
gem install rack-1.4.1.gem
安裝passenger:
下載下傳位址:https://www.phusionpassenger.com/download,在頁面的最下方有一個欄目ALTERNATIVE DOWNLOADS,我選擇了下載下傳source tarball。
這裡有兩種安裝方式,推薦的方式是passenger的互動式安裝。
1)互動式安裝:
tar -xf passenger-3.0.17.tar.gz && cd passenger-3.0.17 && bin/passenger-install-nginx-module
互動式安裝需要聯網,但非常的友善簡單,需要哪些依賴,安裝過程會有提示,包括nginx。也可以首先下載下傳并解壓nginx,在安裝過程中指定源碼目錄即可。
2)把passenger編譯進nginx:
虛拟機不能聯網,我采用的是把passenger編譯進nginx的方式。
下載下傳并解壓pcre,不要安裝:
tar -xf pcre-8.31.tar.gz
下載下傳并解壓passenger:
tar -xf passenger-3.0.17.tar.gz -C /usr/local
下載下傳并安裝nginx,把passenger作為子產品編譯進nginx:
tar -xf nginx-1.2.5.tar.gz && cd nginx-1.2.5
./configure --prefix=/usr/local/nginx --with-pcre=/root/packages/pcre-8.31 --with-http_ssl_module --with-http_gzip_static_module --add-module='/usr/local/passenger-3.0.17/ext/nginx'
注:上述的--with-pcre和--with-openssl都是源碼解壓後的目錄,而不是安裝後的目錄!
vim /usr/local/nginx/conf/nginx.conf,修改HTTP子產品配置,添加如下行:
passenger_root /usr/local/passenger-3.0.17;
#passenger_max_pool_size 15; //屬于調優項,根據實際進行調整
更加詳細的配置,參考passenger官方文檔:http://www.modrails.com/documentation/Users%20guide%20Nginx.html。
配置rack:
mkdir -p /etc/puppet/rack/public
cp /root/packages/puppet-2.7.19/ext/rack/files/config.ru /etc/puppet/rack/
chown -R puppet:puppet /etc/puppet/rack //官方wiki特地強調了config.ru的屬主問題
vim /usr/local/nginx/conf/nginx.conf,添加rack server(即puppet)配置:
server {
listen 8140 ssl;
server_name test_1.com;
passenger_enabled on;
passenger_set_cgi_param HTTP_X_CLIENT_DN $ssl_client_s_dn;
passenger_set_cgi_param HTTP_X_CLIENT_VERIFY $ssl_client_verify;
root /etc/puppet/rack/public;
access_log logs/puppet_access.log;
error_log logs/puppet_error.log;
ssl_certificate /etc/puppet/ssl/certs/test_1.com.pem;
ssl_certificate_key /etc/puppet/ssl/private_keys/test_1.com.pem;
ssl_crl /etc/puppet/ssl/ca/ca_crl.pem;
ssl_client_certificate /etc/puppet/ssl/certs/ca.pem;
ssl_prefer_server_ciphers on;
ssl_verify_client optional;
ssl_session_cache shared:SSL:128m;
ssl_session_timeout 5m;
開機啟動nginx,網上找到了一個腳本:
#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
# It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/usr/local/nginx/logs/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
# Stop nginx daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
[ $RETVAL = 0 ] && rm -f $nginx_pid
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
reload)
reload
restart)
status)
status $prog
*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
esac
exit $RETVAL
chmod 755 /etc/init.d/nginx
chkconfig --add nginx
chconfig nginx on
添加nginx使用者:
useradd -M -s /sbin/nologin nginx
測試配置檔案:
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
啟動:
service nginx start
用戶端運作如下指令進行測試:
puppet agent --onetime --no-daemonize --verbose --noop
<a href="http://blog.51cto.com/attachment/201212/092208178.jpg" target="_blank"></a>
本文轉自 li_qinshan 51CTO部落格,原文連結:http://blog.51cto.com/share/1100497