Server  IP:192.168.72.10/24   hostname:puppet-server
Client  IP:192.168.72.111/24  hostname:puppet-client-01
Clinet  IP:192.168.72.168/24  hostname:puppet-client-02
关闭selinux
1、配置服务器和客户端的IP地址和主机名,确保可以相互ping通主机名
2、服务器和客户端安装所需环境
[root@puppet]# yum install ruby* -y
注:如果需要精细安装,只需如下4个包
[root@puppet]# yum install ruby-libs ruby ruby-irb ruby-rdoc -y
3、同步服务器和客户端的时间
[root@puppet]# ntpdate time.nist.gov
注:如果没有ntpdate可以yum安装
[root@puppet]# yum install ntpdate -y
4、服务器和客户端安装facter和puppet主程序
5、下载安装facter
[root@puppet]# wget http://downloads.puppetlabs.com/facter/facter-latest.tgz
[root@puppet]# tar -zxvf facter-latest.tgz
[root@puppet facter-1.6.6]# cd facter-1.6.6
[root@puppet facter-1.6.6]# ruby install.rb
6、下载安装puppet
[root@puppet]wget http://puppetlabs.com/downloads/puppet/puppet-2.6.14.tar.gz
[root@puppet]# tar -zxvf puppet-2.6.14.tar.gz
[root@puppet srv]# cd puppet-2.6.14
[root@puppet puppet-2.6.14]# ruby install.rb
7、修改hosts文件
server端
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 puppet-server
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.72.111 puppet-client-01
client端
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 puppet-client-01
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.72.10 puppet-server
8、服务器server端配置
copy源文件
[root@puppet-server puppet-2.6.14]# mkdir /etc/puppet
[root@puppet-server puppet-2.6.14]# cp conf/auth.conf /etc/puppet/
[root@puppet-server puppet-2.6.14]# cp conf/redhat/fileserver.conf /etc/puppet/
[root@puppet-server puppet-2.6.14]# cp conf/redhat/puppet.conf /etc/puppet/
[root@puppet-server puppet-2.6.14]# cp conf/redhat/server.init /etc/init.d/puppetmaster
[root@puppet-server puppet-2.6.14]# chmod +x /etc/init.d/puppetmaster
[root@puppet-server puppet-2.6.14]# chkconfig --add puppetmaster
[root@puppet-server puppet-2.6.14]# chkconfig puppetmaster on
[root@puppet-server puppet-2.6.14]# chkconfig --list puppetmaster
puppetmaster    0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@puppet-server puppet-2.6.14]# mkdir -p /etc/puppet/manifests
创建puppet帐号
[root@puppet-server puppet-2.6.14]# puppetmasterd --mkusers(目的是在/var/lib/puppet下创建一些目录)
启动服务
[root@puppet-server puppet-2.6.14]# /etc/init.d/puppetmaster restart
Stopping puppetmaster:                                     [  OK  ]
Starting puppetmaster:                                     [  OK  ]
9、客户client端配置
[root@puppet-client-01 puppet-2.6.14]# mkdir /etc/puppet/
[root@puppet-client-01 puppet-2.6.14]# cp conf/auth.conf /etc/puppet/
[root@puppet-client-01 puppet-2.6.14]# cp conf/namespaceauth.conf /etc/puppet/
[root@puppet-client-01 puppet-2.6.14]# cp conf/redhat/puppet.conf /etc/puppet/
[root@puppet-client-01 puppet-2.6.14]# cp conf/redhat/client.init /etc/init.d/puppet
[root@puppet-client-01 puppet-2.6.14]# chmod +x /etc/init.d/puppet
[root@puppet-client-01 puppet-2.6.14]# chkconfig --add puppet
[root@puppet-client-01 puppet-2.6.14]# chkconfig puppet on

[root@puppet-client-01 puppet-2.6.14]# vim /etc/puppet/namespaceauth.conf
......
[fileserver]
    allow *
[puppetmaster]
    allow *
[puppetrunner]
    allow *
[puppetbucket]
    allow *
[puppetreports]
    allow *
[resource]
    allow *
......
创建puppet帐号和rra目录
[root@puppet-client-01 puppet-2.6.14]# puppetd --mkusers
注:如果报错,可以手动创建用户。
重启服务
[root@puppet-client-01 puppet]# /etc/init.d/puppet restart
10、服务server端防火墙配置
[root@puppet-server ~]# iptables -A INPUT -p tcp --dport 8140 -j ACCEPT
[root@puppet-server ~]# /etc/init.d/iptables save
11、客户client端防火墙配置
[root@puppet-client-01 ~]# iptables -A INPUT -p tcp --dport 8139 -j ACCEPT
[root@puppet-client-01 ~]# /etc/init.d/iptables save
12、服务端修改配置文件,设置允许的地址
[root@puppet-server ~]# vim /etc/puppet/fileserver.conf
......
 [files]
  path /tmp/srv/
  allow 192.168.72.0/24
......
手动认证
1、客户端发送请求
[root@puppet-client-01 ~]# puppetd --test --server puppet-server
2、服务器端查看
[root@puppet-server ~]# puppetca -l
  puppet-client-01 (4B:58:77:C0:52:22:DD:1E:A4:A8:B8:5E:4F:9C:71:25)
3、服务器签名认证
[root@puppet-server ~]# puppetca -s -a(对所有客户端认证)
notice: Signed certificate request for puppet-client-01
notice: Removing file Puppet::SSL::CertificateRequest puppet-client-01 at '/var/lib/puppet/ssl/ca/requests/puppet-client-01.pem'
注:[root@puppet-server ~]# puppetca -s $hostname(对某个主机认证)
自动认证
1、服务端
[root@puppet-server ~]# vim /etc/puppet/puppet.conf
......
[main]
autosign = true
......
2、客户端
[root@puppet-client-01 puppet-2.6.14]# vim /etc/puppet/puppet.conf
[agent]
......
    listen = true          #打开客户端的监听服务端的puppetrun命令
    server = puppet-server #指定服务端
    puppetport = 8139      #客户端的监听端口,默认是8139,可不加
    runinterval = 60       #同步文件时间,默认1800s
......
3、[root@puppet-client-01 puppet-2.6.14]#puppetd
#客户端运行命令puppetd,会放在后台运行,从此客户端会每隔60s同步一次服务器里的site.pp配置

功能测试:

1、puppet运维自动化之组管理
......
group { "ceshi":                              
            gid => 800,                         #该组的 gid,必须是数字,如果不指定,将自动分配 ,不同的系统自动分配的算法不一样,不推荐使用自动分配gid
            allowdupe => false,                 #是否允许两个相同的gid, 这个参数不能在freebsd上面使用, 可以设置的值是false , true
            ensure => present,                  #创建或者删除组,设置absent就删除该组,设置 present就创建该组
            members => [ ceshi1,ceshi2,ceshi3 ] #该组的成员
}
......
2、puppet运维自动化之文件分发
通过puppet服务器向客户端分发文件
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
......
file
    {"/tmp/srv/darren":        #资源的标题
  name => "/tmp/srv/darren",#name等于标题,所以可以省略
     source => "puppet://puppet-server/files/darren",
     owner =>root,             #客户端下载后的文件属主
     group =>root,             #客户端下载后的文件属组
     mode =>777                #客户端下载后的文件权限
}

......
file
    {"/tmp/srv/darren":
     source => "puppet://puppet-server/files/darren",
}
......
file {
     "/tmp/srv/ceshi.txt":
     content => file("/tmp/srv/ceshi.txt");
}
......

3、puppet运维自动化之crontab文件管理
......
cron { "reboot":
    command => "/sbin/init 6",
    user =>root,
    minute =>35,
    hour =>13
}
#除了name和command这两个参数以外,其他都是可选项
#name该crontab的名字,用于区分不同的crontab
#command是crontab要执行的命令,环境变量按照系统本地规则进行管理,推荐使用绝对路径
#ensure指定该资源是否启用,可设置成true或false
#environment在crontab环境里指定环境变量,例如PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#user把crontab任务加入到默认的crontab列表,默认是运行puppet的用户
#minute运行crontab的分钟,可设置0-59
#hour运行crontab的小时,可设置0-23
#monthday运行crontab的每月中的某一天,可设置1-31
#month运行crontab的月份,1-12
#weekday运行crontab的星期数,0-7
......
4、puppet运维自动化之分类管理客户端
......
node puppet-client-01 {
file {
     "/tmp/srv/192.168.72.0":
     source => "puppet://puppet-server/files/192.168.72.0",
     owner =>root,
     group =>root,
     mode =>777,
     ensure =>present
     }
}
......
#node,节点定义,当一个节点(puppet客户端)连接到puppet服务器端,puppet解析器会查找这个节点的node代码片断,然后利用这个代码片断来生成该客户端的配置代码。
5、puppet运维自动化之yum安装软件包,以httpd模拟测试
......
package { "httpd": ensure => "installed" }
#ensure设置软件包得状态:installd(present)表示要安装该软件,absent表示卸载该软件,latest表示安装软件包的最新版本。
......
6、puppet运维自动化之网络下载安装rpm包
......
     package { "epel":
                ensure => present,
                provider => rpm,
                source => "http://mirrors.sohu.com/fedora-epel//6/x86_64/epel-release-6-5.noarch.rpm"
}
......
7、puppet运维自动化之安装多个软件包
......
Package { ensure => "installed" }  #注意:第一个P是大写,这就意味着对软件包管理设置了一个全局的的参数。
     package { "lrzsz": }
     package { "telnet": }
     package { "sudo": }
......
8、puppet运维自动化之服务管理
......
service {
            "nfs":
             ensure => running;
            "iptables":
             ensure => stopped;
            "puppet":
             enable => true;
            "httpd":
             enable => false;
}
......
参数
#binary :运行服务的命令的路径, 只用于不支持init的操作系统, 如果没有指定启动脚本,就用这个命令来启动服务。
#enable :服务是否随开机而启动,可设置的值为true,false,需要provider支持enableable。
#ensure: 服务是否运行,可设置的值为running,stopped,也可以用true,false。
#hasrestart:指出管理脚本是否支持restart参数,如果不支持,就用stop和start实现restart效果。可以设置的值是true 或 false。
#hasstatus :服务的init脚本是否支持status参数,可设置的值为ture,false。
#name: 该资源的namevar, 服务的名字,通常就是在/etc/init.d/目录下的名字。
#path: 指定查找init 脚本的路径。
#pattern :搜索进程表匹配字符串,用于不支持init的脚本,当要停止一个服务的时候,通过查看进程运行列表来判断。
#provider :The specific backend for provider to use,可设置的值有base, daemontools,init等。
#restart :重启服务
#start: 开启服务
#status :服务运行状态
#stop: 停止服务
9、puppet运维自动化之主机管理
......
#客户端192.168.72.128添加主机别名name01和name02
host { "name":           
           ip => '192.168.72.128',
           host_aliases => ["name01", "name02" ],
           ensure =>'present'
}
......
#host:安装和管理主机实体。对大部分系统来说,这些实体就在/etc/hosts文件中
#ip:主机的IP地址
#host_aliases:主机别名,可以有多个,多个值需要指定为一个数组。
#ensure:确定该主机是否启用,有效值present和absent
10、puppet运维自动化之执行外部命令
......
#客户端解压puppet软件包
exec { "tar xf /tmp/srv/puppet-2.6.14.tar.gz":
        cwd => "/tmp/srv/",
        creates => "/tmp/srv/puppet",
        path => ["/bin","/usr/bin","/usr/sbin"]
}
......
#cwd:指定命令执行的目录。如果目录不存在,则命令执行失败
#creates:指定命令所生成的文件。如果提供了这个参数,那么命令只会在所指定的文件不存在的情况的被执行
#path:命令执行的搜索路径。如果path没有被定义,命令需要使用绝对路径。路径可以以数组或以冒号分隔的形式来定义。

11、puppet运维自动化之目标客户端执行脚本(前提是客户端已经存在该脚本)
......
#客户端执行hello.sh脚本
exec {
     "/tmp/srv/hello.sh":
      cwd =>"/tmp/srv",
      timeout =>120,      #脚本的执行时间,防止死循环,单位为秒
      user =>root,
      path =>["/sbin","/usr/local/sbin","/usr/local/bin","/usr/bin","/bin"],
}
......


错误解决参考:
http://k.ifeng.com/149804/4112878
http://www.mysqlops.com/2011/11/08/puppet-errors.html