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