天天看點

puppet 2.7安裝配置與擴充

伺服器: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 &amp;&amp; cd passenger-3.0.17 &amp;&amp; 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 &amp;&amp; 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" ] &amp;&amp; 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 ] &amp;&amp; touch /var/lock/subsys/nginx 

return $RETVAL 

# Stop nginx daemons functions. 

stop() { 

echo -n $"Stopping $prog: " 

killproc $nginxd 

[ $RETVAL = 0 ] &amp;&amp; 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

繼續閱讀