<<精通puppet配置管理工具>>--书名
puppet是一种Linux、Unix平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
puppet 是一个配置管理工具, 典型的, puppet 是一个 C/S 结构, 当然,这里的 C 可以有很多,因
此,也可以说是一个星型结构. 所有的 puppet 客户端同一个服务器端的 puppet 通讯. 每个
puppet 客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配
置文件来配置服务器. 配置完成以后,puppet 客户端可以反馈给服务器端一个消息. 如果出错,
也会给服务器端反馈一个消息.
puppet 的细节和原理
puppet 的目的是让你只集中于你要管理的目标,而忽略实现的细节,例如命令名,参数或者文件
格式. puppet 把系统里面的用户,软件包,服务看作是"资源", puppet 的作用就是管理这些资源
以及资源之间的相互联系.
http://puppet.wikidot.com    #中文 wiki
系统环境:rhel6.3 selinux and iptables disabled
    sever:192.168.0.201 puppet.example.com
    agent:192.168.0.202 desktop2.example.com
server 与所有 client 之间需要解析,以及时间同步,不然会验证失败。
server 端:在网上下载rubygems 软件,是puppet-server 的依赖包,puppet是基于ruby语言的
# yum localinstall -y rubygems-1.3.7-1.el6.noarch.rpm
把以下条目加入 yum 仓库:
[puppet]
name=puppet
baseurl=http://yum.puppetlabs.com/el/6Server/products/x86_64/
gpgcheck=0
[ruby]
name=ruby
baseurl=http://yum.puppetlabs.com/el/6Server/dependencies/x86_64/
gpgcheck=0
如果是rhel 6.0 ,则需指定6.3的镜像,安装augeas-libs 软件包,安装后再把6.3的镜像enabled=0.
# yum install puppet-server -y

在客户端:
把以下条目加入 yum 仓库:
[puppet]
name=puppet
baseurl=http://yum.puppetlabs.com/el/6Server/products/x86_64/
gpgcheck=0
[ruby]
name=ruby
baseurl=http://yum.puppetlabs.com/el/6Server/dependencies/x86_64/
gpgcheck=0
下载rubygems
yum localinstall -y rubygems-1.3.7-1.el6.noarch.rpm
如果是rhel 6.0 ,则需指定6.3的镜像,安装augeas-libs 软件包,安装后再把6.3的镜像enabled=0.
yum install puppet -y

server 端:
cd /etc/puppet/manifests
touch site.pp           server 端 开启时需要此文件(在/etc/sysconfig/puppetmaster文件中可以查看)
/etc/init.d/puppetmaster   start
netstat -antlpe

客户端:
vim /etc/hosts
192.168.0.195    puppet  (在/etc/sysconfig/puppet 文件中有定义server,端口,日志)
puppet  help   查看puppet 后接命令
puppet help  agent   查看agent 的选项
puppet agent --server=puppet  --no-daemonize --verbose  可以看到输出创建密钥,证书
然后在server 端:puppet cert --list  查看证书
              puppet cert --sign server96.example.com  签名证书
然后在客户端:查看证书签名成功
/etc/init.d/puppet   restart

自动验证:
在 server 端, 编辑 puppet.conf 文件:
[main]
autosign = true
#允许所有客户端的认证
/etc/puppet 目录下创建 autosign.conf 文件,内容如下:
*.example.com          #表示允许所有 example.com 域的主机
# service puppetmaster reload
在 client 端只需执行:
# puppet agent --server=puppet  --no-daemonize  --verbose 会看到自动验证
在实际中有时会修改 client 端的主机名,这样就需要重新生成证书:
1)在 server 端执行:puppet cert --clean desktop2.example.com #你要删除的原 client 端主机名
2)在 client 端执行:rm -fr /var/lib/puppet/ssl/*
puppet agent --server=puppet.example.com

注:如果实验过程中ip改变,出现下面情况:
Info: Creating a new SSL certificate request for desktop97.example.com
Info: Certificate Request fingerprint (SHA256): 35:3E:66:3E:14:30:BE:03:25:B2:62:B6:B4:D2:80:C1:03:4A:62:6B:31:56:41:04:ED:1B:8E:76:26:11:EE:E5
Info: Caching certificate for desktop97.example.com
Info: Caching certificate_revocation_list for ca
Warning: Unable to fetch my node definition, but the agent run will continue:
Warning: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate revoked for /CN=desktop76.example.com]
Info: Retrieving plugin
Error: /File[/var/lib/puppet/lib]: Failed to generate additional resources using 'eval_generate: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate revoked for /CN=desktop76.example.com]
Error: /File[/var/lib/puppet/lib]: Could not evaluate: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate revoked for /CN=desktop76.example.com] Could not retrieve file metadata for puppet://puppet/plugins: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate revoked for /CN=desktop76.example.com]
Error: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate revoked for /CN=desktop76.example.com]
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
Error: Could not send report: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate revoked for /CN=desktop76.example.com]
则需将 /root/.ssh/  目录删除(rm /root/.ssh/  -fr)

下面是puppet 实现的功能:
server 端:
cd /etc/puppet/manifests
vim site.pp
node "server96.example.com" {
    file {"/var/www/html/index.html": content => "www.westos.org}
}
在客户端:
puppet agent --server=puppet  --no-daemonize  --verbose  #在客户端就将index.html的内容改为了 www.westos.org
如果想删除文件的话:
node "server96.example.com" {
    file {"/var/www/html/index.html": ensure => absent }
}
如果想安装软件包:
node "server96.example.com" {
    file {"/var/www/html/index.html": ensure => absent }
    package {'vim-enhanced': ensure => present }
}
如果想添加用户:
node "server96.example.com" {
    file {"/var/www/html/index.html": ensure => absent }
    package {'vim-enhanced': ensure => present }

    group { "smart": gid => 600 }

    user { "smart":
     uid => 600,
     gid => 600,
     home => "/home/smart",
     shell => "/bin/bash" }

    file { "/home/smart":
         owner => smart,                #属主
         group => smart,                #属组
         mode => 700,                   #权限
         ensure => directory            #确保是目录
        }
        file { "/home/smart/.bash_logout":
        source => "/etc/skel/.bash_logout",   #源文件
        owner => smart,
        group => smart
        }
        file { "/home/smart/.bash_profile":
        source => "/etc/skel/.bash_profile",
        owner => smart,
        group => smart
        }
        file { "/home/smart/.bashrc":
        source => "/etc/skel/.bashrc",
        owner => smart,
        group => smart
        }

}
如果想启动服务:
     添加:service { "httpd": ensure => running }  #httpd为启动脚本名称