第一,Puppet介绍:
        puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
        puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置服务器. 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息.
        第二,工作原理:
         puppet既可以在单机上使用,也可以以c/s结构使用.在大规模使用puppet的情况下,通常使用c/s结构.在这种结构中puppet客户端只是指运行puppet的服务器,puppet服务器端是只运行puppetmaster的服务器.
         puppet客户端首先会连接到puppet服务器端,并且通过facter工具把客户端的基本配置信息发送给服务器端. 服务器端通过分析客户端的主机名,通过node 定义,找到该主机的配置代码,然后编译配置代码,把编译好的配置代码发回客户端,客户端执行代码完成配置.并且把代码执行情况反馈给puppet服务器端.
修改系统配置
         puppet 通过管理资源的方式来管理系统, 例如管理某个软件是否要安装,是安装最新的还是安装了就行. 管理某个服务是否开启, 管理某个文件的属性,内容等等. 所有的资源都有对应的几个属性可以设置. 通过设置属性的方式来管理资源. 有一种特殊的属性可以用在所有的资源上面,这种属性叫做 metaparams ( 元参数或者元属性).
1)         客户端通过facter收集客户端信息并发送至服务端
2)         连接服务端并请求catalog日志
3)         请求节点(node)的信息
4)         从服务器端接收节点(node)的实例
5)         编译代码(包括语法检查等工作)
6)         查询是否有exported 虚拟资源
7)         如有,则从数据库接收虚拟资源
8)         接收完整的catalog日志
9)         存储catalog日志到数据库
10)       客户端接收完整的catalog日志
        
        第三,案例目标:
实现文件同步并修改文件所属帐户:
测试环境:
puppetserver :    10.0.3.170
puppet1 :            10.0.3.171

        第四,安装配置:
两台机器都需要安装必要软件:yum install ntp vixie-cron wget vim-enhanced telnet
软件的下载地址:
facter:    http://downloads.puppetlabs.com/facter/facter-1.6.17.tar.gz
facter是一个系统盘点工具,收集主机的一些资料,比如CPU,主机IP等,它收集到值发送给puppet服务器端,服务器端就可以根据不同的条件来对不同的节点机器生成不同的puppet配置文件,安装puppet之前必须先安装facter。

        服务器puppetserver安装部署:
1. 准备环境
同步时间:ntpdate  pool.ntp.org (如果时间不同步会有问题)
由于puppet是由ruby语言编写,所以要安装ruby环境及库文件
安装ruby:yum install ruby ruby-libs (也可以yun install ruby*)
2. 修改HOSTS
修改双方的/etc/hosts文件,添加各自的IP地址对应的主机名,生产环境做内部DNS比较好,不用修改每台服务器的hosts文件。
10.0.3.170 puppetserver
10.0.3.171 puppet1
3. 开放端口:
8140(server服务器端口),8139(client服务器端口)
/sbin/iptables -I INPUT -s *  -p tcp --dport 8140 -j ACCEPT
/sbin/iptables -I INPUT -s *  -p tcp --dport 8139 -j ACCEPT
或是干脆chkconfig iptables off 半闭防火墙
4. 源码安装:安装facter和puppet
wget http://downloads.puppetlabs.com/facter/facter-1.6.17.tar.gz
tar zxvf facter-1.6.17.tar.gz
cd facter-1.6.17
ruby install.rb
cd ..

wget https://downloads.puppetlabs.com/puppet/puppet-2.7.10.tar.gz
tar zxvf puppet-2.7.10.tar.gz
cd puppet-2.7.10
ruby install.rb 
cd ..
5. 复制文件:
cp conf/auth.conf /etc/puppet/
cp conf/redhat/fileserver.conf /etc/puppet/
cp conf/redhat/puppet.conf /etc/puppet/
cp conf/redhat/server.init /etc/init.d/puppetmaster
chmod +x /etc/init.d/puppetmaster
chkconfig --add puppetmaster
chkconfig puppetmaster on
chkconfig --level 35 puppetmaster on
mkdir -p /etc/puppet/manifests
6. 生成pupput用户:
puppetmasterd --mkusers
7. 启动服务:
/etc/init.d/puppetmaster restart


        客户端puppetclient安装部署:
1. 环境准备:
同步时间:ntpdate  pool.ntp.org (如果时间不同步会有问题)
安装ruby:yum install ruby ruby-libs 
添加用户:useradd puppet
2. 修改HOSTS:
修改双方的/etc/hosts文件,添加各自的IP地址对应的主机名,生产环境做内部DNS比较好,不用修改每台服务器的hosts文件。
10.0.3.170 puppetserver
10.0.3.171 puppet1
3. 开放端口:
开放8140(server服务器端口),8139(client服务器端口)
/sbin/iptables -I INPUT -s *  -p tcp --dport 8140 -j ACCEPT
/sbin/iptables -I INPUT -s *  -p tcp --dport 8139 -j ACCEPT
或是干脆chkconfig iptables off 半闭防火墙
4. 安装facter和puppet:
wget http://downloads.puppetlabs.com/facter/facter-1.6.17.tar.gz
tar zxvf facter-1.6.17.tar.gz
cd facter-1.6.17
ruby install.rb

wget https://downloads.puppetlabs.com/puppet/puppet-2.7.10.tar.gz
tar zxvf puppet-2.7.10.tar.gz
cd puppet-2.7.10
ruby install.rb 
5. 复制文件:
cp conf/auth.conf /etc/puppet/
cp conf/namespaceauth.conf /etc/puppet/
cp conf/redhat/puppet.conf /etc/puppet/
cp conf/redhat/client.init /etc/init.d/puppet
chmod +x /etc/init.d/puppet

vi /etc/puppet/puppet.conf  
---内容如下
[agent]
Listen = true
Server = puppetserver
---
vi /etc/puppet/namespaceauth.conf
----内容如下
[fileserver]
allow *
[puppetmaster]
allow *
[puppetrunner]
allow *
[puppetbucket]
allow *
[puppetreports]
allow *
[resource]
allow *

        第三步:认证
客户端发送请求:puppetd --server puppetserver --test
服务器查看:puppetca --list
并执行:puppetca -s -a

        第四步:功能测试:
通过puppet可以向被管理机上推送文件,方法是使用file类型的source属性,并修改文件为puppet用户及组:
实例:要把server服务器上/opt目录下的文件传输至client服务器的/opt目录下,文件名不变。
第一步:Vi /etc/puppet/fileserver.conf
[files]
path /opt/
allow 10.0.3.0/24
第三步:vi /etc/puppet/manifests/site.pp
file 
{ "/opt/zhu.html":
source => "puppet://$puppetserver/files/zhu.html",
owner => "puppet",
group => "puppet",
mode => 777,
}

第四步:在/opt/目录下创建文件
echo "this is puppet test page"> /opt/zhu.html

第五步:client端执行
puppetd --server puppetserver --test
成功!

          第五,总结:
学习过程中,参考了庖丁解的技术博客,在此表示感谢,如有不正之处请网友指正,一起直步。
总体感觉可以基于该平台做很多事,后续还有一些应用实例。
参考
puppet官方网站:http://www.puppetlabs.com/
puppet中文wiki:http://puppet.chinaec2.com/
puppet中文论坛:http://www.puppetfans.com