Puppet是一个为实现数据中心自动化管理而设计的配置管理软件。Puppet通过使用自有的puppet描述语言(与Ruby类似),可管理配置文件、用户、cron任务、软件包、系统服务等。在puppet中,这些实体统称为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
Puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。当puppet服务启动时(如#service puppet start),每个puppet客户端每半小时(可以设置,见本文“设置客户端自动同步时间间隔”一节)连接一次服务器端,下载最新的配置文件,并且严格按照配置文件来配置服务器。配置完成以后puppet客户端可以反馈给服务器端一个结果消息。
Puppet的服务器端保存着所有的对客户端服务器的配置代码,在puppet里面叫做manifest. 客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理、用户管理和文件管理等等。此外,puppet也可以单机方式工作,这时,相当于对一台机器的配置进行即时快照,便于后来还原各种配置(软件包、文件等),类似于系统还原、GHOST,只是更灵活些。
相对于CFEngine、LCFG、Bcfg2,Puppet的优势是,免费并且开源、语法及功能丰富、用户群广大。
Puppet采用Ruby语言编写,源码库: https://github.com/puppetlabs/puppet
Puppet主页:http://puppetlabs.com/
安装篇
OS:CentOS Linux 6.0 64-bit
主机信息:
角色 | 主机名称 | IP |
服务端 | server.puppet | 192.168.1.42 |
客户端 | client.puppet | 192.168.1.43 |
准备工作:
1.Puppet使用ssl认证来确保客户端与服务端的通信,所以没用通过认证,双方无法工作。要求主机上有SSL软件包,这里是openssl。
2.据说要在安装puppet软件前先设置主机名,因为生成证书的时候要把主机名写入证书,如果证书生成好了再改主机名就连不上。 另外主机名必须使用FQDN格式。
(1)server.puppet上如下设置
编辑/etc/sysconfig/network,把那行HOSTNAME=server.puppet
编辑/etc/hosts,把那行127.0.0.1 之后加上server server.puppet
添加一行 192.168.1.43 client.puppet
(2)client.puppet上如下设置
编辑/etc/sysconfig/network,把那行HOSTNAME=client.puppet
编辑/etc/hosts,把那行127.0.0.1 之后加上client client.puppet
添加一行 192.168.1.42 server.puppet
设置完成后两台主机互PING检查一下。
3.安装puppet软件
# rpm -ivh /root/epel-release-6-5.noarch.rpm
warning: /root/epel-release-6-5.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing... ########################################### [100%]
1:epel-release ########################################### [100%]
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
# yum install -y puppet
程序安装后主目录为/var/lib/puppet,并且默认生成配置目录:
/etc/puppet/auth.conf
/etc/puppet/puppet.conf
/etc/sysconfig/puppet
测试一下安装情况:
# service puppet status
puppetd 已停
表明puppet安装成功。
4.在服务端和客户端分别执行时间同步
#ntpdate time.nist.gov
5.防火墙与SELinux
服务端防火墙TCP的8140端口须开放
服务端需要关闭SELinux
运行篇
方式一:单机模式
直接在命令行执行一个写好的puppet文件,例如,新建一个文件在/puppet-demo/helloworld.pp(这种以pp后缀的文件在puppet中称作manifest文件),内容如下:node default{
file { "/puppet-demo/msrdok.txt":
content => "hello,world",
mode => 0644; }
}
上面代码的含义是在/puppet-demo/msrdok.txt位置创建文件,文件内容为"hello,world",文件权限为644。
运行
#puppet /puppet-demo/helloworld.pp
notice: Finished catalog run in 0.01 seconds
然后查看/puppet-demo/msrdok.txt是不是被成功创建。
采用这种方式,可以把一些常用的配置操作保存成puppet脚本,当有新的环境需要配置时,直接在新机器上执行 puppet脚本即可。
方式二:C/S模式
- server.puppet主机上
确保puppet服务端正在运行
# service puppet start
下面安装puppet-server
测试一下安装后效果# yum install -y puppet-server ...... Installed: puppet-server.noarch 0:2.6.18-3.el6 Complete!
# service puppetmaster status puppetmasterd 已停 # service puppetmaster start
安装完成后会在文件系统生成/etc/puppet/manifests目录和/etc/puppet/fileserver.conf文件,注意puppet的第一个执行的代码是在/etc/puppet/manifest/site.pp,当客户端连接到服务端时默认会去执行这个site.pp文件。因此这个文件必须存在。
现在,建立一个最简单的site.pp文件,内容如下:node default{ file {"/tmp/eye.txt": content => "1111,22";} }
上面的代码对默认连入的puppet客户端执行一个操作,在/tmp目录生成一个eye.txt文件,内容是"1111,22"。
- client.puppet主机上
执行
# puppetd --server server.puppet --test
info: Caching certificate for ca
info: Creating a new SSL certificate request for server.puppet
info: Certificate Request fingerprint (md5): 3B:16:1D:11:01:3B:DE:2D:CE:B5:07:65:29:25:29:33
Exiting; no certificate found and waitforcert is disabled
出现这个错误原因是:客户端未被服务端(主机server.puppet上)认证。 上面的命令让puppetd 从 server.puppet 去读取puppet配置文件. 第一次连接,双方会进行ssl证书的验证,这是一个新的客户端,在服务器端那里还没有被认证,因此需要在服务器端进行证书认证.在服务器端的机器上执行下面的命令来认证客户端的证书
/**执行这句会得到待认证的客户端,与puppet cert list等效,如果不存在待认证的客户端,会出现 err: Could not call sign: Could not find certificate request for client.puppet**/
# puppetca -l //等价于puppetca --list
"client.puppet" (3B:16:1D:11:01:3B:DE:2D:CE:B5:07:65:29:25:29:33)
# puppetca -s client.puppet //等价于puppetca --sign,对所有待认证客户端签名可使用puppetca -s -a命令
然后再重新在客户端执行
# puppetd --server server.puppet --test
info: Caching certificate for client.puppet
info: Caching certificate_revocation_list for ca
info: Caching catalog for client.puppet
info: Applying configuration version '1383189866'
notice: /Stage[main]//Node[default]/File[/tmp/eye.txt]/ensure: defined content as '{md5}bd869b69868f59b21be375383a51841c'
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.03 seconds
也可以在服务端执行以下命令对客户端进行认证:
# puppet cert list
"client.puppet" (3B:16:1D:11:01:3B:DE:2D:CE:B5:07:65:29:25:29:33)
/**表明client.puppet主机未获得认证,下面的命令将进行认证。**/
# puppet cert sign client.puppet
notice: Signed certificate request for client.puppet
notice: Removing file Puppet::SSL::CertificateRequest client.puppet at '/var/lib/puppet/ssl/ca/requests/client.puppet.pem'
有时需要agent重新申请认证,如下操作:
在服务端
puppet cert clean client.puppet
在客户端:
rm -f /var/lib/puppet/ssl/ca/requests/client.puppet.pem
puppetd --test --trace --debug
看配置是否有异常
这次终于执行成功,是客户端主机上查看/tmp目录,看是不是已经有个eye.txt文件了。
设置客户端自动同步时间间隔
默认情况下,客户端agent 每 30分钟会向 master 请求一次。如果我们不希望 agent 自动更新。
可采取以下任意方法:
(1)#puppet agent --server=192-9-117-162-app.com --test --no-client --listen
#puppet agent --server=192-9-117-162-app.com --test --no-daemonize --onetime
(2)打开puppet服务所在文件,/etc/rc.d/init.d/puppet,找到
[ -n "${PUPPET_SERVER}" ] && PUPPET_OPTS="--server=${PUPPET_SERVER} "
这一行,然后在最末尾添加--no-client
添加后的效果:
[ -n "${PUPPET_SERVER}" ] && PUPPET_OPTS="--server=${PUPPET_SERVER} --no-client"
然后重启客户端puppet,/etc/init.d/puppet restart ,这样客户端就不会主动跟服务端同步了(记得把/etc/puppet/puppet.conf里runinterval注释掉)。
然后去服务端执行
#puppet kick -d --host 客户端主机名
即可实现只想推送功能。
(3)在/etc/sysconfig/puppet文件中设置
PUPPET_EXTRA_OPTS=--no-client
这种方式与(2)中方法异曲同工,但更简洁、方便。
(4)在 /etc/puppet/puppet.conf 的 [main] 段加上如下的指令:
runinterval=3m #间隔3分钟
Troubleshootings
1.客户端执行test出错
# puppetd --server server.puppet --test
err: Could not request certificate: Connection refused - connect(2)
Exiting; failed to retrieve certificate and waitforcert is disabled
解决办法:
(1)确保设置好hosts文件,
(2)#service puppetmaster start)
2.服务器启动puppetmaster失败
# service puppetmaster start
启动 puppetmaster:Could not prepare for execution: Cannot save ca; parent directory /var/lib/puppet/ssl/ca does not exist
[失败]
解决办法:关闭 SELinux
3.客户端执行test出错
# puppetd --server server.puppet --test
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for client.puppet
err: Could not retrieve catalog from remote server: certificate verify failed
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
原因:客户端和服务器端的时间不同步。
解决办法:客户端和服务器端运行/usr/sbin/ntpdate time.nist.gov
参考文献
http://docs.puppetlabs.com/references/stable/configuration.html
http://docs.puppetlabs.com/guides/configuring.html
http://369369.blog.51cto.com/319630/785895
http://puppet.wikidot.com/file
http://bbs.linuxtone.org/thread-22751-1-1.html