天天看点

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

继续阅读