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 />
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试
Puppet安装测试

Puppet安装测试

  • 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 />