在云计算时代,系统管理员经常陷入一系列重复性的工作中,如创建虚拟机、安装或重装系统、升级软件包、管理配置文件、添加、管理和配置系统服务等。这些工作效率低下且枯燥乏味。我们需要把它们自动化,所以就有了系统管理员自己写的脚本,用自定义的脚本来自动化,但是要保证自己写的脚本在不同的平台上能流畅运行,并不容易。操作系统每次更新,都需要重新测试自定义脚本,耗时耗力大,灵活性和功能性也难以保证。而且,脚本语言虽然简单,但自己写的脚本,其他管理员未必能第一时间看懂。有时候看别人写的脚本或者代码并不是一件愉快的事情。于是就有了Puppet和Chef这样的自动化配置管理工具。为什么Linode仅用19个人就可以在数千台服务器上处理数万用户?这就是自动化的好处。 Puppet是一个客户端/服务器(C/S)架构的配置管理工具,在中央服务器上安装puppet-server服务器(puppetmaster),在需要的目标服务器上安装puppet客户端软件(puppetmaster)被管理的客户端)。当客户端连接到服务器时,会编译在服务器上定义的配置文件,然后在客户端运行。客户端每隔半小时会主动与服务器通信,确认配置信息的更新。如果有新的配置信息(或配置变更),会重新编译配置文件,分发给客户端执行。当然,也可以在服务端主动触发更新命令,强制每个客户端进行配置更新。 以下安装使用两台服务器,一台是master.vpsee.com安装puppet-server服务;另一个是client.vpsee.com用于安装puppet客户端。 Puppet要求所有机器都有一个完整的域名(FQDN)。如果没有DNS服务器提供域名,可以在两台机器上设置hostname(注意在安装Puppet之前一定要先设置hostname,因为安装Puppet的时候,把hostName写进证书里,这是需要的用于客户端和服务器之间的通信:#vi/etc/hosts192.168.2.10mastermaster.vpsee.com192.168.2.11clientclient.vpsee.com Puppet需要所有机器的时钟同步,所以需要安装并开启ntp服务(如果使用CentOS-6.2-x86_64-minimal.iso最小安装,需要另外安装这个包)。#yuminstallntp#chkconfigntpdon#ntpdatepool.ntp.org29Feb15:22:47ntpdate[15867]:steptimeserver196.25.1.1offset98.750417sec#servicentpdstartStartingntpd:[OK] 安装傀儡服务 Puppet需要Ruby支持,如果你想要查看命令行帮助需要额外的ruby-rdoc包:#yuminstallrubyruby-libruby-rdoc Puppet不在CentOS基础源中,需要添加PuppetLabs官方提供的源:#yum-yinstallwget#wgethttp://yum。puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-1.noarch.rpm#yuminstallpuppetlabs-release-6-1.noarch.rpm#yumupdate 在master上安装并启用puppet服务:#yuminstallpuppet-server#chkconfigpuppeton#servicepuppetmasterstartStartingpuppetmaster:[OK] Closeiptables:#/etc/init.d/iptablesstopiptables:Flushingfirewallrules:[OK]iptables:SettingchainstoppolicyACCEPT:filter[OK]iptables:Unloadingmodules:[OK] 安装puppet客户端 在客户端安装puppet客户端:#yuminstallpuppet Puppet客户端使用HTTPS与服务器(master)通信。为了与服务器通信,它必须有合法的SSL认证。当Puppet客户端第一次运行时,会生成一个SSL证书并发送到Puppet服务器。#puppetagent--no-daemonize--onetime--verbose--debug--server=master.vpsee.com Puppetserver收到客户端的证书后必须签名(sign)才能让客户端访问,签名检查后用puppetcertlist–all,你会发现client.vpsee.com前面多了一个+,代表“加入”成功:#puppetcertlist--allclient.vpsee.com(65:3C:20:82:AE:F6:23:A8:0A:0B:09:EF:05:64:1D:BB)+master.vpsee.com(AF:A0:32:78:D4:EB:D3:EE:02:1C:62:1C:83:3C:46:EC)(altnames:DNS:master,DNS:master.vpsee.com)#puppetcert--signclient.vpsee.comnotice:Signedcertificaterequestforclient.vpsee.comnotice:RemovingfilePuppet::SSL::CertificateRequestclient.vpsee.comat'/var/lib/puppet/ssl/ca/requests/client.vpsee.com.pem'#puppetcertlist--all+client.vpsee.com(65:3C:20:82:AE:F6:23:A8:0A:0B:09:EF:05:64:1D:BB)+master.vpsee.com(AF:A0:32:78:D4:EB:D3:EE:02:1C:62:1C:83:3C:46:EC)(altnames:DNS:mas 这样客户端和服务端就配置好了,可以通信了。 Hello,world 现在你可以在服务器端写一个小例子来测试它。这个例子非常简单。用于在客户端的/tmp目录下创建一个helloworld.txt文件,内容为hello,world。在服务器上写代码:#vi/etc/puppet/manifests/site.ppnodedefault{file{"/tmp/helloworld.txt":content=>"hello,world";} 在客户端执行puppet,运行成功后会在/tmp中看到新生成的helloworld.txt:.vpsee.com信息:Cachingcertificate_revocation_listforca信息:Cachingcatalogforclient.vpsee.com信息:Applyingconfigurationversion'1330668451/Stmaindefa]/File[/tmp/helloworld.txt]/ensure:definedcontentas'{md5}e4d7f1b4ed2e42d15898f4b27b019da4'信息:home/creatingsee/.puppet/var/state/state.yamlnotice:Finishedcatalogrunin0.03seconds$cat/tldmp/hell.txthello,world 想偷懒的可以直接使用Example42的开源Puppet模块。
