本文共 9630 字,大约阅读时间需要 32 分钟。
服务器: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 -
注: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。 -
tar -xf openssl-1.0.1c.tar.gz && cd openssl-1.0.1c -
./config --prefix=/usr/local/openssl-1.0.1 -fPIC -
-
tar -xf ruby-1.9.3-p286.tar.gz && cd ruby-* -
./configure --prefix=/usr/local/ruby-1.9 -
-
echo 'export PATH=$PATH:/usr/local/ruby-1.9/bin:/usr/local/ruby-1.9/sbin/' >>/etc/profile -
-
tar –xf facter-1.6.13.tar.gz && cd 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,修改如下行:
-
-
-
-
-
-
-
-
测试启动:puppet master --no-daemonize --verbose
启动:puppet master
这里就不要生成system V脚本了,因为生产环境中一般会有nginx或apache放在前端处理客户端连接,然后由nginx或apache调用puppet master,puppet master不需要作为一个独立进程来运行。
五、客户端配置及申请证书:
生成配置文件:
puppet agent --genconfig >/etc/puppet/puppet.conf
vim /etc/puppet/puppet.conf,修改如下行:
-
-
-
-
-
-
-
-
-
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,内容如下:
-
-
-
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的用途:
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。 -
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)配置:
-
-
-
-
-
-
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; -
-
-
-
# nginx Startup script for the Nginx HTTP Server -
-
-
# description: Nginx is a high-performance web and proxy server. -
# It has a lot of features, but it's not for everyone. -
-
# 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 -
-
-
# Source function library. -
. /etc/rc.d/init.d/functions -
# Source networking configuration. -
-
# Check that networking is up. -
[ ${NETWORKING} = "no" ] && exit 0 -
-
# Start nginx daemons functions. -
-
if [ -e $nginx_pid ];then -
echo "nginx already running...." -
-
-
echo -n $"Starting $prog: " -
daemon $nginxd -c ${nginx_config} -
-
-
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx -
-
-
# Stop nginx daemons functions. -
-
echo -n $"Stopping $prog: " -
-
-
-
[ $RETVAL = 0 ] && rm -f $nginx_pid -
-
-
-
echo -n $"Reloading $prog: " -
#kill -HUP `cat ${nginx_pid}` -
-
-
-
-
# See how we were called. -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
echo $"Usage: $prog {start|stop|restart|reload|status|help}" -
-
-
-
chmod 755 /etc/init.d/nginx -
-
-
useradd -M -s /sbin/nologin nginx
-
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
-
puppet agent --onetime --no-daemonize --verbose --noop
本文转自 li_qinshan 51CTO博客,原文链接:http://blog.51cto.com/share/1100497
转载地址:http://ojkum.baihongyu.com/