随着系统平台规模的不断壮大,系统环境也变得越来越复杂,需要管理的设备也越来越多,这时候仅仅使用脚本维护已经慢慢的有些吃力了,比较明显的是系统管理的效率比较差、出错率增大。这时候集中管理工具的优势就很明显了。 集中管理配置工具有很多,比如puppet,cfengine,chef,saltstack等,本文主要简单介绍下puppet。
一、 puppet 系统架构
Puppet是开源的基于Ruby的系统配置管理工具,puppet是一个C/S结构, 当然,这里的C可以有很多,因此,也可以说是一个星型结构. 所有的puppet客户端同一个服务器端的puppet通讯. 默认情况下每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置服务器. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息. 下图展示了一个典型的puppet配置的数据流动情况
二、 puppet工作流程
1.客户端Puppet向Master发起认证请求,或使用带签名的证书。
2.Master为Client签名授权。
3.客户端Puppetd调用Facter,Facter探测出主机的一些变量,例如主机名、内存大小、IP地址等。Puppet将这些信息通过SSL连接发送到服务器端。
4.服务器端的Puppet Master检测客户端的主机名,然后找到manifest对应的node配置,并对该部分内容进行解析。Facter送过来的信息可以作为变量处 理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,首先是语法检查,如果语法错误就报错;如果语法没错,就继续解析,解析的结果生成一个中间的“伪代码”(catelog),然后把伪代码发给客户端。
5.客户端接收到“伪代码”,并且执行。
6.客户端在执行时判断有没有File文件,如果有,则向fileserver发起请求。
7.客户端判断有没有配置Report,如果已配置,则把执行结果发送给服务器。
8.服务器端把客户端的执行结果写入日志,并发送给报告系统。
三、 puppet的安装使用
下面是3台服务器的基本环境,使用CentOS 6.4 x64默认发行版本,内核版本2.6.32-358.el6.x86_64,Master作为puppet服务器,Client1/Client2作为puppet客户端
1.配置DNS解析
Master、Client1/2操作:
Puppet要求所有机器有完整的域名(FQDN),由于测试环境没有搭建DNS服务器,所以直接修改hosts配置解析(注意要先设置主机名再安装 Puppet,因为安装 Puppet 时会把主机名写入证书,客户端和服务端通信需要这个证书)
vi/etc/hosts
192.168.100.100 master master.test.com
192.168.100.201 test1 test1.test.com
192.168.100.202 test2 test2.test.com
修改/etc/resolv.conf
默认search域为localdomain,所以需要指定search域为test.com
sed -i 's@^search.*@search test.com@g' /etc/resolv.conf
2.配置时间同步
Master、Client1/2操作:
Puppet 要求所有机器上的时钟保持同步,所以需要安装和启用 ntp 服务
yum -y install ntp
chkconfig ntpd on
service ntpd start
ntpdate time.nist.gov
echo "* */12 * * * root /usr/sbin/ntpdate time.nist.gov >/dev/null &" >>/etc/crontab
3.安装 puppet 服务
Master、Client1/2操作:
a.Puppet 需要 Ruby 的支持,所以需要先安装ruby环境
yum -y install ruby*
Puppet 不在CentOS 的基本源中,需要加入 PuppetLabs 提供的官方源:
yum -y install wget
wget http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm
rpm -ivh puppetlabs-release-6-7.noarch.rpm
b.设置防火墙和Selinux
chkconfig iptables off
service iptables stop #或者开放8139、8140
sed -i 's@SELINUX=.*@SELINUX=disabled@g' /etc/selinux/config #需要重启生效
Master操作:
a.安装Facter
Facter用来获取客户端系统信息(如主机名、ip、系统版本等,并作变量使用)
yum -y install facter
b.安装Puppet服务端
yum install puppet-server
chkconfig puppet on
service puppetmaster start
Client1/2操作:
a.安装 puppet 客户端(已安装ruby和puppet源)
yum install puppet
b.配置puppet
对于puppet 客户端,修改/etc/puppet/puppet.conf,添加如下参数:
server= master.test.com #指定Master地址
listen= true #监听端口8139
report= true #开启report
runinterval= 600 #设置自动同步时间600秒
service puppet restart
4.设置证书
Puppet 客户端使用SSL 和master通信,为了和服务器端通信必须有合法的 SSL 认证,第一次运行 puppet 客户端的时候会生成一个 SSL 证书并指定发给 Puppet 服务端。
Client1/2操作:
客户端请求证书
puppet agent --server=master.test.com
为了详细了解注册的过程及方便排错,可以考虑增加如下参数:
--no-daemonize #前台输出日志
--verbose#输入更加详细的日志
--debug#更加详细的日志,排错的时候使用
--test #表示测试
puppet agent --no-daemonize --verbose --server=master.test.com
Master操作:
Puppet 服务端收到客户端的证书后必须签字(sign)才允许客户端接入(如果使用后面的自动签名证书,则此步骤可跳过)
puppet cert list --all
puppet cert--sign test1.test.com
puppet cert--sign test2.test.com
puppet cert list --all #注意前面的+
至此,客户端和服务端就配置完成。
服务端自动签发证书设置:
自动签名可减少在Master上的签名操作,但也有可能带来其他隐患(比如同一个授权域名内全部有效),设置master自动签发所有的证书,只需要在/etc/puppet 目录下创建 autosign.conf 文件,添加授权的域名即可
echo "*.test.com" >>/etc/puppet/autosign.conf
这样就会对所有来自test.com的机器的请求,都自动签名而不需要在Master上一个一个签名。
5.测试Puppet
在服务端创建配置文件,用来在客户端的 /tmp 目录下创建check.txt文件,内容为A file,用户、用户组为nobody,权限为0600
Master操作:
# vi/etc/puppet/manifests/site.pp
node default {
file { "/tmp/check.txt":
ensure => file,
content => "A file.\n",
owner => 'nobody',
group => 'nobody',
mode => 0600,
}
}
Client1/2操作:
手动同步服务器配置:
puppet agent -t
puppet默认设置自动时间已经设置为600秒
查看客户端文件状态
可以看到,客户端已经获取服务器端的配置更改。Master和Client已经建立同步...