Puppet安装测试

1,702 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,702
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Puppet安装测试

  1. 1. puppet安装测试<br />一、Puppet可以实现如下功能<br />随着服务器的增加,传统的系统维护方法有点捉襟见肘,于是出现了配置管理软件,利用配置管理,可以把整个公司的服务器的所有配置内容管理起来,方便大规模的管理以及快速的部署。<br />Puppet就是一个为实现数据库中心自动化管理而设计的C/S模式配置管理软件。<br />二、Puppet的几个概念<br />服务器端和客户端:服务器端保存和推送配置到客户端;<br />清单(manifest):服务器端保存的客户端配置文件,客户端下载了manifest以后就可以应用。<br />资源:客户端配置中能管理到的对象被称为资源,常见(但不限于)的资源有:<br />文件 用户组 用户 软件包 yum库 服务 crontab任务 文件系统挂载 zfs hosts主机管理 exec<br />三、试验说明<br />本试验分为两部分:<br />1.首先安装建立一个puppet的C/S模型;<br />在两台服务器上分别安装puppet,其中一个是服务器端,一个是客户端。<br />待到服务器端和客户端都安装完成,客户端可以从服务器端获得一个Manifest,并依此修改一个文件,本段试验完成。<br />2.测试最常用的资源的推送应用。<br />四、实验环境的系统介绍<br />服务端:192.168.118.15 server.puppet.com<br />客户端:192.168.118.152 client.puppet.com<br />OS/Kernal:CentOS release 5.4 (Final)2.6.18-164.el5 #1 SMP<br />五、安装Puppet前的软件准备(以服务器端为例)<br />1.添加puppet用户<br />groupadd puppet<br />useradd -g puppet -s /bin/false -M puppet<br />2.修改Host文件<br />echo "192.168.118.151 server server.puppet.com" >> /etc/hosts<br />echo "192.168.118.152 client client.puppet.com" >> /etc/hosts<br />3.安装ruby<br />puppet是基于ruby开发的,所以必须安装ruby,可以使用yum或rpm安装ruby<br />rpm -qa|grep ruby<br />ruby-libs-1.8.5-5.el5_3.7<br />ruby-1.8.5-5.el5_3.7<br />4.安装facter<br />facter是官方wiki上提到必须要安装的一个包,是用来搜集当前安装系统的环境变量信息的<br />wget http://projects.puppetlabs.com/attachments/download/1101/facter-1.5.8.tar.gz<br />tar zxf facter-1.5.8.tar.gz && cd facter-1.5.8/<br />ruby install.rb && cd ~<br />#执行以下这个命令就可以看到facter获取到的变量名和内容<br />facter<br />请在客户端client上也执行上述命令。<br />六、开始安装Puppet(以服务器端server为例)<br />wget http://projects.puppetlabs.com/attachments/download/1114/puppet-2.6.1.tar.gz<br />tar xzf puppet-2.6.1.tar.gz && cd puppet-2.6.1<br />ruby install.rb <br />#安装完成后我们要拷贝默认的配置文件到/etc/puppet<br />cp conf/redhat/* /etc/puppet/ && cd ~<br />七、验证安装成功<br />puppet master<br />ps -ef|grep puppet<br />puppet 1871 1 0 23:02 ? 00:00:00 /usr/bin/ruby /usr/bin/puppet master<br />请在客户端client上也执行上述命令。<br />八、服务器端设定<br />1.将puppetmasterd设置为服务,并自启动<br />cp /etc/puppet/server.init /etc/init.d/puppetmasterd<br />chmod 755 /etc/init.d/puppetmasterd<br />chkconfig --add puppetmasterd<br />chkconfig --level 35 puppetmasterd on<br />service puppetmasterd start<br />2.防火墙和端口设定<br />puppet服务器端默认使用8140端口监听服务,需要在iptables上开启该端口<br />iptables -A INPUT -p tcp --dport 8140 -j ACCEPT<br />#请在/etc/sysconfig/iptables 中加入上文的规则,并重启iptables<br />九、审批证书<br />1.客户端申请证书<br />telnet server.puppet.com 8140<br />#验证解析和链接是否正常<br />Trying 192.168.118.151...<br />Connected to Server.puppet.com (192.168.118.151).<br />Escape character is '^]'.<br />Connection closed by foreign host.<br />puppetd --test --server server.puppet.com<br />#向服务器端申请证书<br />warning: peer certificate won't be verified in this SSL session<br />info: Caching certificate for ca<br />warning: peer certificate won't be verified in this SSL session<br />warning: peer certificate won't be verified in this SSL session<br />info: Creating a new SSL certificate request for client.puppet.com<br />info: Certificate Request fingerprint <br />(md5): C5:5A:5E:A9:04:44:CF:A7:F3:46:14:6A:C7:C1:24:C8<br />warning: peer certificate won't be verified in this SSL session<br />warning: peer certificate won't be verified in this SSL session<br />warning: peer certificate won't be verified in this SSL session<br />Exiting; no certificate found and waitforcert is disabled<br />2.服务器接受申请<br />#查看当前待批准证书列表<br />puppetca --list<br />client.puppet.com<br />#批准当前证书<br />puppetca -s client.puppet.com<br />notice: Signed certificate request for client.puppet.com<br />notice: Removing file Puppet::SSL::CertificateRequest client.puppet.com at '/var/lib/puppet/ssl/ca/requests/client.puppet.com.pem'<br />3.客户端取回已经通过审批的证书<br />puppetd --test --server server.puppet.com<br />warning: peer certificate won't be verified in this SSL session<br />info: Caching certificate for client.puppet.com<br />info: Caching certificate_revocation_list for ca<br />info: Caching catalog for client.puppet.com<br />info: Applying configuration version '1287374005'<br />info: Creating state file /var/lib/puppet/state/state.yaml<br />notice: Finished catalog run in 0.01 seconds<br />注意上文中的红色粗体部分,生成证书时主机名会写入证书,如果生成证书后再更改主机名证书就失效了<br />而且请不要用client这类简写名字,而应该用client.puppet.com这类全名申请证书<br />4.重新审批旧机器的新证书<br />当申请到证书以后我们对比下这两个文件,他们的MD5值是一样的.<br />#这是服务器端<br />md5sum /var/lib/puppet/ssl/ca/signed/client.puppet.com.pem<br />b750f6702d7958b6af40819572de3e7d /var/lib/puppet/ssl/ca/signed/client.puppet.com.pem<br />#这是客户端<br />md5sum /var/lib/puppet/ssl/certs/client.puppet.com.pem<br />b750f6702d7958b6af40819572de3e7d /var/lib/puppet/ssl/certs/client.puppet.com.pem<br />其实申请证书的过程就是服务器端生成证书,并发送到客户端的过程。<br />如果因为意外要重新给旧机器审批证书,我们需要做以下两点才可以重新注册。<br />rm -f /var/lib/puppet/ssl/ca/signed/client.puppet.com.pem<br />#服务器端需要删除已经注册给客户机“client.puppet.com”的证书。<br />rm -rf /var/lib/puppet/ssl/<br />#客户端也需要删掉SSL目录。<br />十、功能测试<br />在服务器端新建一个/etc/puppet/manifests/site.pp文件,大意是在/tmp下创建caotest.txt测试文件。<br />vim /etc/puppet/manifests/site.pp<br />node default {<br />file {"/tmp/caotest.txt": <br />content=>"I'm Caotest PUPPET"; }<br />}<br />#初次创建这个文件需要重启服务<br />/etc/init.d/puppetmasterd restart<br />在客户端执行命令会得到如下提示信息:<br />puppetd --test --server server.puppet.com<br />info: Caching catalog for client.puppet.com<br />info: Applying configuration version '1287350100'<br />notice: /Stage[main]//Node[default]/File[/tmp/caotest.txt]/ensure: defined content as '{md5}366e5662f290439eef7b150b2b0228d1'<br />notice: Finished catalog run in 0.07 seconds<br />cat /tmp/caotest.txt<br />I'm Caotest PUPPET<br />十一、客户端设置守护进程<br />puppetd --server server.puppet.com --verbose --waitforcert 60<br /># --server 告诉它master结点的ip,--waitforcert是说每60秒去server检查,--verbose是可选的输出冗余信息<br />至此,Puppet C/S环境搭建完毕,接下来会进行更深入的配置文件语法介绍和不同类型的资源调节、测试。<br />十一、最简单的mainfest<br />node default { <br />file {<br />"/tmp/caotest.txt":<br />content=>"I'm Caotest PUPPET"}<br />}<br />说明:<br />下面就以刚才的示例文件来举例说明puppet的配置文件语法<br />node default { #节点设置,default是所有节点都会应用的设置;<br />file { #file{…}定义了资源的类型是文件;<br />"/tmp/caotest.txt": #资源的title,在未设置文件名时兼职做文件名;<br />content=>"test1" #content定义内容的动作,引号里是具体的内容;<br />} <br />} #中括号内的设置都会应用到default节点上;<br />十二、稍微有些变化的例子<br />node 'www','resin' {<br />file { <br />caotest2: <br />name => "/tmp/caotest2.log", <br />content=>"I'm Caotest2 PUPPET. <br />Beijing huanying ni !<br />test 1234." <br />}<br />service { <br />cups: <br />ensure =>stopped; <br />xfs: <br />ensure =>stopped; <br />}<br />}<br />import "idctest/sky.pp" <br />说明:<br />node 'www','resin' { #只指定www和resin两个节点会执行下面的操作;<br />file { #file{…}定义了资源的类型是文件;<br />caotest2: #这次资源title不兼职做文件名了;<br />name => "/tmp/caotest2.log", #这是上次例子中被省略掉的name项;<br />content=>"I'm Caotest2 PUPPET. #这次我故意将1行内容扩展为三行;<br />Beijing huanying ni !<br />test 1234." #这里才是文件的结尾;<br />}<br />service { #这是另一种资源类型“service”;<br />cups: #资源title和name都是cups;<br />ensure =>stopped; #执行关闭服务的命令;<br />xfs: #在同一资源类型里定义另一个资源;<br />ensure =>stopped; #实际上好几种服务并不支持这样关闭,这是为了说明语法;<br />}<br />#上文中的引号和扩号已经标识的很清楚了,但是诸如冒号(资源名后面)、逗号(资源内属性区分),分号(同一类型内不同资源区分)都很容易被忽略导致语法错误,特用红色加粗字体注明;<br />}<br />import "idctest/sky.pp" #此处类似apache的include可以用相对路径和绝对路径;<br />puppet的实际配置语法并不是太严格,比如说在某些不会引起歧义的地方少个逗号或者分号,在做部分资源定义的时候并不要都加上引号。<br />十三、配置puppet文件服务<br />配置puppet文件服务很简单,修改下文配置文件并重启服务<br />egrep -v "^#|^$" /etc/puppet/fileserver.conf<br />[hosts123] <br />path /etc/puppet/client_conf/hosts<br />allow * <br />[code]<br />path /etc/puppet/client_conf/code<br />allow *<br />/etc/init.d/puppetmasterd restart<br />#重启服务<br />说明:<br />[hosts123] #设置模块名字为“hosts123”;<br />path /etc/puppet/client_conf/hosts #模块路径;<br />allow * #用allow、deny来限制使用者,设置为*是允许所有人访问;<br />[code] #设置模块名字为“code”;<br />path /etc/puppet/client_conf/code #模块路径;<br />allow * #用allow、deny来限制使用者,设置为*是允许所有人访问;<br />十四、File资源的几个主要属性<br />下面是截取的一段manifests以对节点cms进行配置为例讲解常用file资源属性:<br />node ' client.puppet.com ' {<br />file {"/etc/hosts":<br />source => "puppet://server. puppet.com/hosts123/host1",<br />backup => ".bak_$uptime_seconds",<br />}<br />file {"/tmp/testfile1":<br />source => "/etc/sysconfig/i18n",<br />backup => ".bak_$uptime_seconds",<br />group => daemon, <br />owner => daemon,<br />mode => 600;<br />}<br />$aaa = "ceshi bianliang"<br />file {"/tmp/testfile2":<br />content => $aaa}<br />file { <br />/tmp/testfile3:<br />ensure => "/etc/sysconfig/network"; <br />/tmp/testfile4:<br />ensure => absent;<br />/tmp/testfile5:<br />ensure => present; <br />/tmp/testdir1:<br />ensure => directory;<br />/tmp/testdir2/:<br />ensure => absent,<br />force => true;<br />}<br />file {/tmp/testdir3: <br />ensure => directory,<br />source => "puppet://server. puppet.com/code",<br />ignore => '*log*',<br />recurse => true,<br />purge => true, <br />force => true,<br />}<br />}<br />说明:<br />node 'client.puppet.com' { #配置只对节点名为" client.puppet.com "的服务器生效;<br />file {"/etc/hosts": #定义同步hosts文件;资源title和path二合一的表示方法;<br />source => "puppet://server.puppet.com/hosts123/host1",<br />#数据来源自puppet文件服务器,其中"hosts123"是上文文件服务器中设置的模块名;<br />#源文件在服务器端的绝对路径是/etc/puppet/client_conf/hosts/host1;<br />backup => ".bak_$uptime_seconds",<br />}<br />file {"/tmp/testfile1":<br />source => "/etc/sysconfig/i18n", #文件取自客户机本机的绝对路径,并非服务器;<br />backup => ".bak_$uptime_seconds",<br />#这是可选项,在替换文件时可以对源文件进行备份,".bak"以点开头;<br />#说要通过原名加后缀名的方式做备份,$uptime_seconds是前文安装的facter软件提取的变量,选开机秒数做命名是考虑到不易重名;<br />假设当前开机了15554秒,备份后的/tmp/testfile1的全名应该为“/tmp/testfile1.bak_15554”;<br />group => daemon, #设置文件属组;<br />owner => daemon, #设置文件属主;<br />mode => 600; #设置文件权限;<br />}<br />$aaa = "ceshi bianliang" #也可以给变量赋值,随意设定变量aaa;<br />file {"/tmp/testfile2":<br />content => $aaa} #变量的内容可以直接导入到文件内;<br />file { #测试一个叫做ensure的资源属性;<br />/tmp/testfile3:<br />ensure => "/etc/sysconfig/network"; #将/etc/sysconfig/network做个软链接;<br />/tmp/testfile4:<br />ensure => absent; #absent是检测文件是否存在,如果存在则删除;<br />/tmp/testfile5:<br />ensure=>present; #present正好相反,如果不存在则创建;<br />/tmp/testdir1:<br />ensur=>directory; #创建一个目录的方法;<br />/tmp/testdir2/: #可以看到,资源定义里写不写最后一个斜杠都没关系;<br />ensure=>absent, #这是删除一个目录的方法;<br />force=>true; #删除目录必须加上这个参数,目录下的文件、子目录都被强制删除;<br />}<br />file {/tmp/testdir3: #尝试整目录内的内容的复制,跟rsync差不多;<br />ensure=>directory, #定义这是个必须存在的目录;<br />source=>"puppet://server.puppet.com /code", #指定数据的来源;<br />ignore=>'*log*', #排除不同步的log目录和文件,支持shell下常用的通配符;<br />recurse=>true, #是否递归到子目录,该选项必须选;<br />purge=>true, #是否要删除服务器端没有而客户端有的文件(可选项);<br />force=>true, #配合上文,如果要删除的是子目录就需要加上force参数;<br />}<br />} #整个节点的括号,一定不要忘记.<br />十五、服务器端准备测试用源文件<br />请按照我下文中tree的结果创建测试文件<br />pwd<br />/etc/puppet/client_conf #注意我当前所在的目录;<br />tree<br />|-- code #这是code模块,我们测试多文件复制功能,可以都是空文件;<br />| |-- codea<br />| |-- debuglog #这些带log/tmp/bak的目录和文件是用来测试排除功能的;<br />| |-- logs<br />| | `-- aaa #测试目录被排除、但文件不被排除的情况;<br />| |-- logs-java<br />| `-- work #这是测试多级深层目录用的;<br />| |-- code_bak<br />| | `-- codea<br />| |-- user_log #测试多级目录是否仍然有排除功能;<br />| `-- woking<br />`-- hosts #这个文件夹里的文件不能是空文件,必须是能正常解析服务器和客户机名的正确hosts文件,建议拷贝客户端现在使用的hosts;<br />`-- host1<br />十六、在客户端执行“puppetd --test --server server.puppet.com”,检查以下要点:<br />1.服务器端的host1文件内容是否同步到了本机,且改名为hosts了。<br />2./tmp/testfile1是否创建了,且内容和本机/etc/sysconfig/i18n一致,属主、属组、权限是否符合设定要求;<br />3./tmp/testfile2的文件内容是否是“ceshi bianliang”;<br />4./tmp/testfile3是不是一个连接到network的软连接;<br />5./tmp/testfile5是否被创建;<br />6./tmp/testdir1是否被创建,且是一个目录;<br />7./tmp/testdir3目录是否被创建,文件、子目录是否被创建,按文件名匹配是否排除了log?<br />十七、二次调试<br />刚才只是创建了一些文件,我们模拟一下这些文件的维护工作。<br />首先我们在服务器端更改一些文件:<br />1.修改host1,在文尾加入“#test 111”,请注意不要忽略井号。<br />2.模拟更新代码,修改并添加几个code目录下不会被排除的文件;<br />然后在客户端做如下设置:<br />1.修改/etc/hosts,在文尾加入“#test 222”;<br />2.给/etc/sysconfig/i18n在文尾加入“#test 333”;<br />3.手工创建/tmp/testfile4;<br />4.手工创建/tmp/testdir2,并在该目录下新建一些子文件夹和文件;<br />5.模拟程序运行过程中会产生一些临时文件,在/tmp/testdir3下改动新建一个叫做client_log的文件;<br />6.模拟骇客入侵恶意修改主页,修改/tmp/testdir3/codea;<br />十八、再次在客户端执行同步命令,同步完成后检查如下要点:<br />1./etc/hosts中客户端修改的部分被擦除,服务器端修改的部分被保留,且留下了名为/etc/hosts.bak_xxxxx的备份文件;<br />2./tmp/testfile1的内容和/etc/sysconfig/i18n同步更新,且留下了/tmp/testfile1.bak_xxxxx的备份文件;<br />3./tmp/testfile4被删除<br />4./tmp/testdir2目录是否被移除;<br />5.检查/tmp/testdir3下是否完成了代码更新工作;<br />6.检查/tmp/testdir3下的client_log文件是否被删除;<br />7.检查被骇客修改过的/tmp/testdir3/codea是否恢复了正常。<br />额外测试<br />功能限制<br />1.在使用中大家请注意,对部分需要转义符去除特殊含义的目录和文件,puppet在处理时会出现故障<br />如我们在客户机新建一个包含中括号的文件“/tmp/testdir3/a[d]”,然后客户端执行同步命令就会报错<br />Failed to generate additional resources using 'eval_generate': Invalid tag "/tmp/testdir3/a"<br />2.purge并不会和ignore协同工作;<br />比如说我首先注释掉了“ignore => '*log*'”,然后客户端更新,会将服务器端包含log的文件也更新下来;<br />然后再重新让“ignore => '*log*'”生效,客户端的log文件并不会被删除。<br />

×