Puppet是一个配置管理工具,典型的,puppet是一个C/S结构,当然,这里的C(客户端)可以有很多,因此,也可以说是一个星形结构,所有的puppet客户端同一个服务器端的puppet通讯。每个puppet客户端每半小时连接一次客户端(时间也可以设置为其他),下载最新的配置文件,并且严格按照配置文件来配置服务器,配置完成以后,puppet客户端可以反馈给服务器端一个消息,如果出错,也会给服务器端反馈一个消息。下面是一个典型的puppet配置的数据流动情况
1 (管理员)管理员编写puppet manifest,提交到svn (svn db svn db备份 ) 只需要备份svn,你就备份了所有的服务器配置 哪怕是上万台计算机 这里的备份数据不会超过100M
2 从svn取出所有的puppet配置信息
3 (puppet master)客户端facter收集服务器信息发送给puppet master (连接是基于ssl和证书的,保证了安全性)
4 puppet master 根据收集到的客户端信息,编译manifest,发回到客户端
5(多个puppet client) puppet执行从服务器收到的manifest,完成对机器的配置
稳定性
Puppet与其他手工操作工具由一个最大区别就是puppet的配置具有稳定性,因此你可以多次执行puppet,一旦你更新了你的配置文件,puppet就会根据配置文件夹更改你的机器配置,通常每30分钟检查一次,puppet会让你的系统状态同配置文件所要求的状态保持一致(比如你配置文件里要求ssh服务必须开启,加入不小心把ssh服务关闭了,那么下一次执行puppet的时候,puppet会发现这个异常,然后会开启ssh服务,以使系统状态和配置文件保持一致) puppet就像一个魔术师 会让你混乱的系统收敛到puppet配置文件想要的状态,可以使用puppet管理服务器的整个生命周期,从初始化到退役,不同于传统的例如sun的jumpstart或者redhat的kickstart,puppet可以长年让服务器保持最新状态,只要一开始就正确的配置他们,然后再也不用去管他们,通常puppet用户只需要给机器安装好puppet并让他们运行,然后剩余的工作就交给puppet来完成
Puppet的细节和原理
Puppet的目的时为了让你只集中于你要管理的目标,而忽略实现的细节,例如命令名 参数或者文件格式,puppet把系统里面的用户 软件包 服务等看作是资源,puppet的作用就是管理这些资源以及资源之间的相互联系。
Puppet采用了非常简单的C/S架构,所有数据的交互都通过ssl进行,以保证安全,它的工作流程入图所示:
Puppet clientpuppet master
Connet1plugins
2
Facter3ENC
4
Apply catalognode $certname(
$conf = linux
Class {‘ssh’:
Ssh_key=>’$file’,
}
)
5
File?Comple catelog functions
6
Reportfileserver
8 7
Finishreport
1 客户端puppet向master发起认证请求,或使用带签名的证书
2 Master告诉client你是合法的
3 客户端puppetd调用faster,faster探测出主机的一些变量,例如主机名,内存大小,ip地址等,puppet将这些信息通过ssl连接发送到服务器端
4 服务器端的puppet master检测客户端的主机名,然后找到manifest对应的node配置,并对该部分内容进行解析。Facter送过来的信息可以作为变量处理,node牵扯到的代码才解析,其他没牵扯到的代码不解析。解析分为几个阶段,首先是语法检查,如果语法错误就报错;如果语法没错,就继续解析,解析的结果生成一个中间的伪代码(catelog),然后把伪代码发给客户端
5 客户端接收到伪代码 并且执行
6 客户端在执行时判断有没有file文件,如果有 则向fileserver发起请求
7 客户端判断有没有配置report,如果已配置,则把执行结果发送给服务器
8服务器端把客户端的执行结果写入日志,并发送给报告系统
@@@@@@@@@@@@@@ puppert @@@@@@@@@@@@@@@@@@@
系统环境:rhel6.3 selinux and iptables disabled
Server:192.168.0.201 desktop1.example.com puppet master
Client: 192.168.0.202 desktop2.example.com puppet agent
Client: 192.168.0.203 desktop3.example.com puppet agent
重要:Server和所有的client之间需要解析,以及时间同步,不然会验证失败
Server端:
yum localinstall -y rubygems-1.3.7-1.el6.noarch.rpm
搭建yum仓库:【puppet】和【ruby]这两个
Yum install -y puppet-server
/etc/puppet配置目录:
组织结构如下:
-puppet.conf 主配置文件,详细内容可执行puppet --genconfig
-fileserver.conf 文件服务器配置文件
-auth.conf 认证配置文件
-autosign.conf 自动验证配置文件
-tagmail.conf 邮件配置文件(将错误信息发送此)
-manifests 文件存储目录(puppet会先读取该目录的.pp文件,<site.pp>)
-node
-puppetclient.pp
-site.pp 定义puppet相关的变量和默认配置
-modules.pp 加载class类模块文件(include syslog)
-modules 定义模块
-syslog 以syslog为例
-file
-manifests
-init.pp class类配置
-templates 模块配置目录
-syslog.erb erb模块
Puppet第一个执行的代码是/etc/puppet/manifest/site.pp,因此这个文件必须存在,而且其他的代码也要通过该文件来调用
touch /etc/puppet/manifest/site.pp
没有此文件puppet master无法启动,配置后面在定义
Service puppetmaster start 启动puppetmaster
Netstat -antlp |grep ruby
Tcp 8140 listen 1596/ruby
Client端:
只需安装puppet即可,安装方法同server端:yum install -y puppet
##客户端连接到puppet master:
Puppet agent --server=desktop1.example.com --no-daemonize --veibose
Info: creating a new SSL key for desktop2.example.com
Info: caching certificate for ca
Info: cteating a new SSL certificate request for desktop2.example.com
Info(information)的缩写 信息 知料 情报 通知
Client向master发出证书验证请求,然后等待master签名并返回证书
参数 --server指定了需要连接的puppet master的名字或是地址,默认连接名为puppet的主机
如果修改默认连接主机可以修改/etc/sysconfig/puppet文件中的PUPPET_SERVER=puppet选项
参数 --no-daemonize是puppet客户端运行在前台
参数--verbose使客户端输出详细的日志
在master端:
Puppet cert list 显示所有等待签名的证书
puppet cert sign desktop2.example.com 签名证书
## 如果同时签名所有证书,执行以下命令:
Puppet cert sign --all
Puppet cert clean desktop2.example.com 删除签名证书
在对证书签名后的两分钟后,在agent端上可以看到如下输出:
Info:caching certification for desktop2.example.com
Starting puppet client version 3.0.0
Info:caching certificate_revocation_list for ca
Info:applying configuration version ‘1349536603’
Finished catalog run in 0.13 seconds
自动验证:
在server端,编译puppet.conf文件:
Vim /etc/puppet/puppet.conf
[main]
Autosign = true 允许所有客户端认证
/etc/puppet 目录下创建autosign.conf文件,内容如下:
Vim /etc/puppet/autosign.conf
*.example.com 表示允许所有example.com域的主机
Service puppetmaster reload
在client端只需执行:
server puppet start
在实际中有时会修改client端的主机名,这样就需要重新生成证书:
1 在server端执行:puppet cert --clean desktop2.example.com
你要删除的原client端主机名
2 在client 端执行 : rm -fr /var/lib/puppet/ssl/*
Puppet agent --server=puppet.example.com
Puppet资源定义
一下资源均可在
server1
装8个软件 在打开服务 /etc/init.d/puppertmaster start
server2
装7个软件 在打开服务 /etc/init.d/puppert start
发送请求 puppet agent --server server1.example.com --no-daemonize -vt
server1
puppet cert list 显示所有的等待签名的证书
puppet cert list --all
puppet cert sign server2.example.com ##发送证书
在server2上
puppet agent --server server1.example.com --no-daemonize -vt
## 查看发送的证书
在server3 上
装7个软件
在server1 上cd /etc/puppet
vim autosign.conf(自创文件)
*.example.com
vim puppet.conf
在【main】目录下加 autosign = true
/etc/init.d/puppetmaster reload
在server3
puppet agent --server server1.example.com --no-daemonize -vt
### 即可发送请求成功
在server1
puppet cert list --all
puppet cert clean server2.example.com
puppet cert list --all
在server2
puppet agent --server server1.example.com --no-daemonize -vt
### 会有报错 因为修改了配制文件 得到了认证 发送请求自动成功
cd /var/lib/puppet/ssl rpm -qf /var/lib/puppet/ssl ls rm -fr *
删除之后 在向master发送认证请求 就不会报错了 若再有报错就重启一下puppetmaster reload
在server1
puppet cert list --all 即可看到三个证书请求
在server1
cd manifests/ vim site.pp (自创)
file {
"/tmp/testfile":
content => "www.westos.org"
}
在server2
puppet agent --server server1.example.com --no-daemonize -vt 即可
server1变动的东西cat /tmptestfile md5sum /tmp/testfile
vim /tmp/testfile 随便加一些东西在发送请求可看到变动
puppet agent --server server1.example.com --no-daemonize -vt
在cat /tmp/testfile 会看到server2的/tmp/testfile 文件已经被主服务器更改了
server2受server1操纵