puppet 是基于 rubby开发,C/S架构,支持多平台,可以管理配置文件、用户、cron任务、软件包、系统服务等。分为社区免费版和企业收费版,企业版支持图形化配置。
一、安装和配置
1、准备工作
准备两台机器,这两台机器都关闭 selinux,清空 iptables 规则并保存。
master:192.168.0.109
slaver:192.168.0.110
2、编辑 hosts 文件
两台都设置,若机器太多,可以通过搭建 DNS,则不用在每台机器上设置这个
# vim /etc/hosts
192.168.0.109 master.test.com 192.168.0.110 slaver.test.com |
3、设置 hostname
在 master 上
[[email protected] ~]# vim /etc/sysconfig/network
HOSTNAME=master.test.com |
在 slaver 上
[[email protected] ~]# vim /etc/sysconfig/network
HOSTNAME=slaver.test.com |
4、安装 ntpdate
两台机器都要安装 ntpdate,并建立自动同步时间的任务计划
# yum install -y ntp
# crontab -e
*/10 * * * * ntpdate time.windows.com >/dev/null 2>&1 //每十分钟同步一次 |
5、服务端安装配置
1)安装puppet源
[[email protected] ~]# rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm
2)安装服务端程序
[[email protected] ~]# yum install -y puppet-server
3)启动服务
[[email protected] ~]# service puppetmaster start
4)开机启动
[[email protected] ~]# chkconfig puppetmaster on
6、客户端安装配置
1)安装puppet源
[[email protected] ~]# rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm
2)安装客户端程序
[[email protected] ~]# yum install -y puppet
3)编辑配置文件
[[email protected] ~]# vim /etc/puppet/puppet.conf //在 [agent] 下添加
server = master.test.com listen = true runinterval = 10 //主动更新,每隔10s |
4)启动服务
[[email protected] ~]# service puppet start
5)开机启动
[[email protected] ~]# chkconfig puppet on
二、配置认证
1、服务端查看客户端证书列表
[[email protected] ~]# puppet cert list --all //如果是已经签发的证书,会在本行最前面带一个"+"
"slaver.test.com" (SHA256) 6A:04:86:D0:CF:1E:CA:AF:77:98:FA:41:1D:06:00:3E:59:76:77:3D:5A:C0:12:11:30:8F:83:83:62:34:B1:39 + "master.test.com" (SHA256) 5E:3B:12:B6:A1:30:20:9A:D1:2C:4D:74:2F:DC:6E:12:15:D0:F5:AD:82:BE:13:2F:D0:2C:C0:68:14:5D:F7:AD (alt names: "DNS:master.test.com", "DNS:puppet", "DNS:puppet.test.com") |
2、客户端上生成 ssl 证书
[[email protected] ~]# puppet agent --test --server master.test.com
3、服务端签发指定客户端证书
[[email protected] ~]# puppet cert --sign slaver.test.com
4、服务端查看客户端证书列表
[[email protected] ~]# puppet cert list --all
+ "master.test.com" (SHA256) 5E:3B:12:B6:A1:30:20:9A:D1:2C:4D:74:2F:DC:6E:12:15:D0:F5:AD:82:BE:13:2F:D0:2C:C0:68:14:5D:F7:AD (alt names: "DNS:master.test.com", "DNS:puppet", "DNS:puppet.test.com") + "slaver.test.com" (SHA256) 63:F4:42:04:31:CD:A2:27:BA:4B:27:BB:76:B3:B8:EA:00:F6:A5:5F:90:60:A2:2F:8D:2C:6C:7B:A8:C2:60:21 |
注意:由上可知配置认证成功
三、测试证书
服务端编辑配置文件
[[email protected] ~]# vim /etc/puppet/manifests/site.pp
node default{ file{"/tmp/123.txt": content => "aaaaababbau"; } } |
注意:如果不配置该文件,则客户端不会同步任何数据。在客户端上等 10s 后会自动执行服务端上的任务,会在客户端的 /tmp/ 目录下生成一个“123.txt”文件,内容为"aaaaababbau"
四、配置自动签发证书
1、服务端删除客户端证书(可以用--all参数全部删除)
[[email protected] ~]# puppet cert clean slaver.test.com
2、客户端删除 ssl 相关文件
[[email protected] ~]# rm -rf /var/lib/puppet/ssl/*
3、服务端编辑配置文件
[[email protected] ~]# vim /etc/puppet/puppet.conf //在 [main] 下添加
autosign = true |
4、服务端创建自动签发的配置文件
[[email protected] ~]# vim /etc/puppet/autosign.conf
*.test.com |
5、服务端重启 puppetmaster 服务
[[email protected] ~]# /etc/init.d/puppetmaster restart
6、客户端重启 puppet 服务
[ro[email protected] ~]# /etc/init.d/puppet restart
7、服务端查看签名
[[email protected] ~]# puppet cert list --all //可以查看到 slaver.test.com 已经签名
注意:如果客户端不重启puppet服务,也可以在服务端通过命令来自动签名
[[email protected] ~]# puppet agent --test --server master.test.com
五、模块管理
模块是 puppet 的最大单元,模块里面有类,类下面有资源。同步文件、远程执行命令、任务计划等叫做资源,都是通过模块来实现的。下面我们来自定义一个模块:
1、服务端上操作
1)创建目录
[[email protected] ~]# mkdir /etc/puppet/modules/testm //模块名称为 testm
[[email protected] ~]# cd /etc/puppet/modules/testm
[[email protected] testm]# mkdir {files,manifests,templates}
注意:一个模块下需要有这三个目录,files存一些文件或目录(可以为空),manifests存模块的主配置文件,templates存模板(可以留空)
2)创建需同步的文件
[[email protected] testm]# touch files/111.txt
[[email protected] testm]# echo "aaaaabbbbbbb" > files/111.txt
3)创建模块的初始入口文件(必须的文件)
[[email protected] testm]# vim manifests/init.pp //内容如下
class testm{ file {"/tmp/222.txt": owner => "root", group => "root", mode => 0400, source => "puppet://$puppetserver/modules/testm/111.txt" } } |
注意:init.pp:包含一个与模块名称同名的类,同时声明其它子类。这里类名字也叫做 testm, 类下面定义了一个资源 file,文件名字叫做 /tmp/222.txt ;owner,group,mode 定义文件的属主、数组以及权限,source 定义这个文件从哪里获取。 $puppetserver 一会儿也要定义一下,这里指的是服务器上的 /etc/puppet/modules/testm/files/111.txt 文件。
[[email protected] testm]# puppet parser validate manifests/init.pp //检查语法是否有错误
4)编辑主配置文件
[[email protected] testm]# vim /etc/puppet/manifests/site.pp //删除之前做实验的,添加内容如下
$puppetserver = ‘master.test.com‘ node ‘slaver.test.com‘{ include testm } |
注意:$puppetserver 定义服务端的主机名,node后面为客户端的主机名,这里面定义该客户端要加载的模块;testm 是类名。
2、客户端操作
1)执行命令:
[[email protected] tmp]# puppet agent --test --server=master.test.com
注意:如果客户端上启动了puppet服务,不用执行这命令,它也会自动同步,因为之前配置了自动认证。
2)查看文件同步成功
[[email protected] tmp]# cat /tmp/222.txt
由上可知,客户端的 /tmp/222.txt 文件与服务端的 /modules/testm/files/111.txt 文件内容一样,同步文件成功。
3、同步目录
上面的模块其实只是同步了一个文件而已,那么要想同步一个目录如何做?我们可以通过实现同步一个目录来做一个包发布系统。 比如在一台机器上编译安装好了apache,那么就可以通过这样的模块把这个apache目录整个分发到其他机器上。
1)准备Apache文档
[[email protected] testm]# cd files/
[[email protected] files]# mkdir apache2
[[email protected] files]# cd apache2
[[email protected] apache2]# mkdir {bin,lib,log}
[[email protected] apache2]# touch lib/config
[[email protected] apache2]# echo "12345abcde" > lib/config
注意:因为我这台机器没有安装Apache,所以手动新建一些测试文件;若安装了Apache,可直接拷贝文件到 files 目录下就行。
2)编辑模块配置文件
[[email protected] testm]# vim manifests/init.pp //添加类
class apache{ file {"/usr/local/apache2": owner => "root", group => "root", source => "puppet://$puppetserver/modules/testm/apache2", recurse => true, purge => true } } |
注意:在管理文件夹时,只有当设置了 recurse 为 true 的情况下,purge 参数才会生效,表示递归的意思,没有这个不能同步目录;purge 参数可以保证当服务端删除某个文件,客户端可以跟着删除。这段逻辑的意思是要清空 /usr/local/apache2 目录下所有非 puppet 管理的文件,purge 参数通常的目的是清理管理目录以及防止被他人添加恶意文件。
[[email protected] testm]# puppet parser validate manifests/init.pp //检查语法是否有错误
3)编辑主配置文件
[[email protected] testm]# vim /etc/puppet/manifests/site.pp //声明 apache 类
$puppetserver = ‘master.test.com‘ node ‘slaver.test.com‘{ include testm include apache } |
4)在客户端查看同步文件成功
4、远程执行命令
1)服务端编辑模块配置文件
[[email protected] ~]# vim /etc/puppet/modules/testm/manifests/init.pp //在之前的apache类下添加资源
exec {"touchfile": unless => "test -f /tmp/444.txt", path => ["/bin", "/sbin", "/usr/bin", "/usr/sbin"], command => "/bin/touch /tmp/444.txt" } |
注意:unless后面的命令作为一个条件,当条件成立时,不会执行下面的命令,如果想要条件成立时,执行下面的命令,用 onlyif。要注意的是,我们一定要给执行的这条命令加个条件,使用unless就可以,必须满足这个条件才能执行命令,否则这个命令会一直执行,不太妥当。
2)客户端查看执行效果
从上图可以看到命令执行成功,从日志文件上也可以看到执行成功的日志信息。
5、任务计划
1)服务端编辑模块配置文件
[[email protected] ~]# vim /etc/puppet/modules/testm/manifests/init.pp //在之前的apache类下添加资源
cron {"tpp1": command => "/sbin/ntpdate time.windows.com", user => "root", minute => "*/10", monthday => "10-15", # ensure => "absent" //当增加了这行配置,则会把该cron删除掉 |
说明:分、时、日、月、周分别对应puppet里面的minute、hour、monthday、month、weekday
2)查看执行效果
从上图可以看到命令执行成功,从日志文件上也可以看到执行成功的日志信息。
6、其他
显示本地已安装的模块:puppet module list
搜索模块:puppet module search Module_Name
安装模块:puppet module install Module_Name
在线下载模块站点:https://forge.puppetlabs.com
package http://puppet.wikidot.com/package
service http://puppet.wikidot.com/srv
exec http://puppet.wikidot.com/exec
cron http://puppet.wikidot.com/cron
扩展学习
Puppet运维自动化经验分享:http://kisspuppet.com
puppet:http://www.cnblogs.com/yuxc/category/431506.html
purge参数模块引发的惨案:http://www.cnblogs.com/yuxc/p/3909066.html
puppet文件管理:http://blog.chinaunix.net/uid-20639775-id-3314583.html
puppet自动化运维专题:http://os.51cto.com/art/201306/398025.htm
puppet模块和类: http://www.mamicode.com/info-detail-35011.html