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 上

[root@master ~]# vim /etc/sysconfig/network

HOSTNAME=master.test.com

在 slaver 上

[root@slaver ~]# 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源

[root@master ~]# rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm

2)安装服务端程序

[root@master ~]# yum install -y puppet-server

3)启动服务

[root@master ~]# service puppetmaster start

4)开机启动

[root@master ~]# chkconfig puppetmaster on


6、客户端安装配置

1)安装puppet源

[root@slaver ~]# rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm

2)安装客户端程序

[root@slaver ~]# yum install -y puppet

3)编辑配置文件

[root@slaver ~]# vim /etc/puppet/puppet.conf //在 [agent] 下添加

server = master.test.com

listen = true

runinterval = 10                     //主动更新,每隔10s

4)启动服务

[root@slaver ~]# service puppet start

5)开机启动

[root@slaver ~]# chkconfig puppet on


二、配置认证


1、服务端查看客户端证书列表

[root@master ~]# 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 证书

[root@slaver ~]# puppet agent --test --server master.test.com

3、服务端签发指定客户端证书

[root@master ~]# puppet cert --sign slaver.test.com

4、服务端查看客户端证书列表

[root@master ~]# 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

注意:由上可知配置认证成功


三、测试证书


服务端编辑配置文件

[root@master ~]# vim /etc/puppet/manifests/site.pp

node default{

file{"/tmp/123.txt": content => "aaaaababbau";

}

}

注意:如果不配置该文件,则客户端不会同步任何数据。在客户端上等 10s 后会自动执行服务端上的任务,会在客户端的 /tmp/ 目录下生成一个“123.txt”文件,内容为"aaaaababbau"




四、配置自动签发证书


1、服务端删除客户端证书(可以用--all参数全部删除)

[root@master ~]# puppet cert clean slaver.test.com

2、客户端删除 ssl 相关文件

[root@slaver ~]# rm -rf /var/lib/puppet/ssl/*

3、服务端编辑配置文件

[root@master ~]# vim /etc/puppet/puppet.conf //在 [main] 下添加

autosign = true

4、服务端创建自动签发的配置文件

[root@master ~]# vim /etc/puppet/autosign.conf

*.test.com

5、服务端重启 puppetmaster 服务

[root@master ~]# /etc/init.d/puppetmaster restart

6、客户端重启 puppet 服务

[root@slaver ~]# /etc/init.d/puppet restart

7、服务端查看签名

[root@master ~]# puppet cert list --all //可以查看到 slaver.test.com 已经签名

注意:如果客户端不重启puppet服务,也可以在服务端通过命令来自动签名

[root@master ~]# puppet agent --test --server master.test.com

五、模块管理


模块是 puppet 的最大单元,模块里面有类,类下面有资源。同步文件、远程执行命令、任务计划等叫做资源,都是通过模块来实现的。下面我们来自定义一个模块:

1、服务端上操作

1)创建目录

[root@master ~]# mkdir /etc/puppet/modules/testm //模块名称为 testm
[root@master ~]# cd /etc/puppet/modules/testm

[root@master testm]# mkdir {files,manifests,templates}

注意:一个模块下需要有这三个目录,files存一些文件或目录(可以为空),manifests存模块的主配置文件,templates存模板(可以留空)

2)创建需同步的文件

[root@master testm]# touch files/111.txt

[root@master testm]# echo "aaaaabbbbbbb" > files/111.txt

3)创建模块的初始入口文件(必须的文件)
[root@master 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 文件。

[root@master testm]# puppet parser validate manifests/init.pp //检查语法是否有错误

4)编辑主配置文件
[root@master testm]# vim /etc/puppet/manifests/site.pp //删除之前做实验的,添加内容如下

$puppetserver = 'master.test.com'

node 'slaver.test.com'{

include testm

}

注意:$puppetserver 定义服务端的主机名,node后面为客户端的主机名,这里面定义该客户端要加载的模块;testm 是类名。

2、客户端操作
1)执行命令:
[root@slaver tmp]# puppet agent --test --server=master.test.com

注意:如果客户端上启动了puppet服务,不用执行这命令,它也会自动同步,因为之前配置了自动认证。

2)查看文件同步成功

[root@slaver tmp]# cat /tmp/222.txt


由上可知,客户端的 /tmp/222.txt 文件与服务端的 /modules/testm/files/111.txt 文件内容一样,同步文件成功。

3、同步目录
上面的模块其实只是同步了一个文件而已,那么要想同步一个目录如何做?我们可以通过实现同步一个目录来做一个包发布系统。 比如在一台机器上编译安装好了apache,那么就可以通过这样的模块把这个apache目录整个分发到其他机器上。

1)准备Apache文档

[root@master testm]# cd files/

[root@master files]# mkdir apache2

[root@master files]# cd apache2

[root@master apache2]# mkdir {bin,lib,log}

[root@master apache2]# touch lib/config

[root@master apache2]# echo "12345abcde" > lib/config

注意:因为我这台机器没有安装Apache,所以手动新建一些测试文件;若安装了Apache,可直接拷贝文件到 files 目录下就行。

2)编辑模块配置文件

[root@master 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 参数通常的目的是清理管理目录以及防止被他人添加恶意文件。

[root@master testm]# puppet parser validate manifests/init.pp //检查语法是否有错误

3)编辑主配置文件
[root@master testm]# vim /etc/puppet/manifests/site.pp //声明 apache 类

$puppetserver = 'master.test.com'

node 'slaver.test.com'{

    include testm

    include apache

}

4)在客户端查看同步文件成功


4、远程执行命令

1)服务端编辑模块配置文件

[root@master ~]# 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)服务端编辑模块配置文件

[root@master ~]# 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​

purge参数模块引发的惨案​

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​