<Puppet 集中配置管理系统RHEL6>

Puppet 集中配置管理系统

puppet 是一个配置管理工具, 典型的, puppet 是一个 C/S 结构, 当然,这里的 C 可以有很多,因此,也可以说是一个星型结构. 所有的 puppet 客户端同一个服务器端的 puppet 通讯. 每个puppet 客户端每半小时(可以设置)连接一服务器端, 下载最新的配置文件,并且严格按照配置文件来配置服务器. 配置完成以后,puppet 客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息. 下图展示了一个典型的 puppet 配置的数据流动情况.

稳定性
    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 进行,以保证安全。

1. 客户端 Puppetd 向 Master 发起认证请求,或使用带签名的证书。
2. Master 告诉 Client 你是合法的。
3. 客户端 Puppetd 调用 Facter,Facter 探测出主机的一些变量,例如主机名、内存大小、IP 地址
等。Puppetd 将这些信息通过 SSL 连接发送到服务器端。
4. 服务器端的 Puppet Master 检测客户端的主机名,然后找到 manifest 对应的 node 配置,并对该
部分内容进行解析。Facter 送过来的信息可以作变量处理,node 牵涉到的代码才解析,其他
没牵涉的代码不解析。解析分几个阶段,首先是语法检查,如果语法错误就报错;如果语法
没错,就继续解析,解析的结 果生成一个中间的“伪代码”(catelog),然后把伪代码发给客
户端。
5. 客户端接收到“伪代码”,并且执行。
6. 客户端在执行时判断有没有 File 文件,如果有,则向 fileserver 发起请求。
7. 客户端判断有没有配置 Report,如果已配置,则把执行结果发送给服务器。
8. 服务器端把客户端的执行结果写入日志,并发送给报告系统。
http://puppet.   wikidot.com  中文 wiki

系统环境:rhel6.3 selinux and iptables disabled
sever: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]
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
# yum install puppet-server -y
/etc/puppet 配置目录:
组织结构如下:
|-- puppet.conf  #主配置配置文件,详细内容可执行 puppet --genconfig
|-- fileserver.conf  #文件服务器配置文件
|-- auth.conf  #认证配置文件
|-- autosign.conf  #自动验证配置文件
|-- tagmail.conf  #邮件配置文件(将错误信息发送)
|-- manifests  #文件存储目录(puppet 会先读取该目录的.PP 文件<site.pp>)
|--nodes 
| 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 #启动 puppet master
# netstat -antlp |grep ruby
tcp 0 0 0.0.0.0:8140 0.0.0.0:* LISTEN 1596/ruby

client 端:

只要安装 puppet 即可,安装方法同 server 端:
# yum install puppet -y
puppet 客户端连接到 puppet master:
# puppet agent --server=puppet.example.com --no-daemonize --verbose 
Info: Creating a new SSL key for desktop2.example.com
Info: Caching certificate for ca
Info: Creating a new SSL certificate request for desktop2.example.com
Info: Certificate Request fingerprint (SHA256): 
5C:72:77:D8:27:DF:5A:DF:34:EF:25:97:5A:CF:25:29:9F:58:83:A2:61:57:D9:20:7B:1E:C0:36:75:9D:
FB:FC
client 向 master 发出证书验证请求,然后等待 master 签名并返回证书。
参数--server 指定了需要连接的 puppet master 的名字或是地址,默认连接名“puppet”的主机
如要修改默认连接主机可以修改/etc/sysconfig/puppet 文件中的 PUPPET_SERVER=puppet 选项
参数--no-daemonize 是 puppet 客户端运行在前台
参数--verbose 使客户端输出详细的日志
在 master 端:
# puppet cert list #显示所有等待签名的证书
"desktop2.example.com" (SHA256) 
CD:BD:13:D0:B8:46:07:F2:B7:AE:00:C4:E6:E9:E1:A4:92:F6:A4:F1:AB:F7:FF:8D:BE:B0:B7:90:E1:
7B:A8:C0
# puppet cert sign desktop2.example.com #签名证书
Signed certificate request for desktop2.example.com
Removing file Puppet::SSL::CertificateRequest desktop2.example.com at 
‘/var/lib/puppet/ssl/ca/requests/desktop2.example.com.pem‘
如要同时签名所有证书,执行以下命令:
# puppet cert sign --all
# puppet cert clean desktop2.example.com #删除签名证书
在对证书签名后的两分钟后,在 agent 端上可以看到如下输出:
Info: Caching certificate for desktop2.example.com
Starting Puppet client version 3.0.0
Info: Caching certificate_revocation_list for ca
Info: Retrieving plugin
Info: Caching catalog for desktop2.example.com
Info: Applying configuration version ‘1349536603‘
Finished catalog run in 0.13 seconds
自动验证:
在 server 端, 编辑 puppet.conf 文件:
[main]
autosign = true #允许所有客户端的认证 
/etc/puppet 目录下创建 autosign.conf 文件,内容如下:
*.example.com #表示允许所有 example.com 域的主机
# service puppetmaster reload 
在 client 端只需执行:
# puppet agent 

# 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 资源定义
以下资源均定义在/etc/puppet/manifest/site.pp 文件中,在没有指定节点的情况下,对所有
已经经过验证的 client 都生效。
1. 创建文件
file { "/var/www/html/index.html": content => "www.example.com" }
mkdir /etc/puppet/files
echo www.redhat.org > /etc/puppet/files/index.html
vi /etc/puppet/fileserver.conf
[files]
path /etc/puppet/files
allow *.example.com
service puppetmaster reload
file { "/var/www/html/index.html":
source => "puppet:///files/index.html",
}
2. 软件包定义
package { “httpd”: ensure => present;
“vsftpd”: ensure => absent
}
3. 服务定义
service { "httpd": ensure => running;
“vsftpd”: ensure => stopped 
}
4. 组定义
group { "wxh": gid => 600 }
5. 用户定义
user { "wxh":
uid => 600,
gid => 600,
home => "/home/wxh",
shell => "/bin/bash" ,
password => westos
}
file { "/home/wxh": 
owner => wxh,
group => wxh,
mode => 700,
ensure => directory
}
file { "/home/wxh/.bash_logout":
source => "/etc/skel/.bash_logout",
owner => wxh,
group => wxh
}
file { "/home/wxh/.bash_profile":
source => "/etc/skel/.bash_profile",
owner => wxh,
group => wxh
}
file { "/home/wxh/.bashrc":
source => "/etc/skel/.bashrc",
owner => wxh,
group => wxh
}
user { "test": uid => 900,
home => "/home/test",
shell => "/bin/bash",
provider => useradd,
managehome => true,
ensure => present
}
exec { "echo westos | passwd --stdin test":
path => "/usr/bin:/usr/sbin:/bin",
onlyif => "id test"
}
6. 文件系统挂载
file { "/public":
ensure => directory
}
mount { "/public":
device => "192.168.0.254:/var/ftp/pub",
fstype => "nfs",
options => "defaults",
ensure => mounted
}
自动挂载文件系统,并同步 fstab 文件,如果需要卸载,改为 absent
7. crontab 任务
cron { echo:
command => "/bin/echo `/bin/date` >> /tmp/echo",
user => root,
hour => [‘2-4‘],
minute => ‘*/10‘
}
# 任务会在 client 上/var/spool/cron 目录中生成。
不同节点的定义:
1. 在 puppetmaster 上编辑 site.pp
# vi /etc/puppet/manifests/site.pp
import "nodes.pp"
2. 建立节点文件
# vi /etc/puppet/manifests/nodes.pp
node ‘desktop2.example.com‘ {
file { "/var/www/html/index.html":
content => "desktop2.example.com"
}
}
node ‘desktop3.example.com‘ {
file { "/var/www/html/index.html":
content => "desktop3.example.com"
}
}
编写模块:
mkdir -p /etc/puppet/modules/httpd/{files,manifests,templates}
cd /etc/puppet/modules/httpd/manifests
vi install.pp
class httpd::install {
package { "httpd":
ensure => present
}
}
vi config.pp
class httpd::config {
file { "/etc/httpd/conf/httpd.conf":
ensure => present,
source => "puppet:///modules/httpd/httpd.conf",
#实际路径在/etc/puppet/modules/httpd/files/httpd.conf
require => Class["httpd::install"],
notify => Class["httpd::service"]
}
}
vi service.pp
class httpd::service {
service { "httpd":
ensure => running,
require => Class["httpd::install","httpd::config"]
}
}
vi init.pp
class httpd {
include httpd::install,httpd::config,httpd::service
}
vi nodes.pp
node ‘server90.example.com‘ {
include httpd
}
service puppetmaster reload
Puppet dashboard 安装 (用以 web 方式管理 puppet)
依赖性:
* Ruby 1.8.7
* RubyGems
* Rake >= 0.8.3
* MySQL server 5.x
* Ruby-MySQL bindings 2.7.x or 2.8.x
# rpm -ivh rubygem-rake-0.8.7-2.1.el6.noarch.rpm
# yum install puppet-dashboard ruby-mysql mysql mysql-server -y
#mysql 5.1 遇到的信息包过大问题用客户端导入数据的时候,遇到错误代码: 1153 - Got a 
packet bigger than ‘max_allowed_packet‘ bytes 终止了数据导入,可以使用如下参数解决:
(rhel6.3 上未遇到)
# vi /etc/my.cnf
[mysqld]
max_allowed_packet = 32M #添加此行
# server mysqld start
配置 mysql 数据库:
mysql> CREATE DATABASE dashboard_production CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE USER ‘dashboard‘@‘localhost‘ IDENTIFIED BY ‘westos‘;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON dashboard_production.* TO ‘dashboard‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)
mysql> 
# cd /usr/share/puppet-dashboard/
# vi config/database.yml #只留下生产环境配置
production:
database: dashboard_production
username: dashboard
password: westos
encoding: utf8
adapter: mysql
# rake RAILS_ENV=production db:migrate #建立 dashboard 所需的数据库和表
puppet-dashboard 默认时区不正确,需要修改:
# vi /usr/share/puppet-dashboard/config/settings.yml
time_zone: ‘Beijing‘
启动服务:
# service puppet-dashboard start
Starting Puppet Dashboard: => Booting WEBrick
=> Rails 2.3.14 application starting on http://0.0.0.0:3000 [ OK ]
# chmod 0666 /usr/share/puppet-dashboard/log/production.log
# service puppet-dashboard-workers start
实时报告汇总:
设置 server 端:
# vi /etc/puppet/puppet.conf
[main] #添加以下两项
reports = http
reporturl = http://192.168.0.201:3000/reports
# service puppetmaster reload
设置 client 端:
# vi /etc/puppet/puppet.conf
[agent] #添加以下行
report = true
# service puppet reload
在客户端安装完 puppet 后,并且认证完后,我们可以看到效果,那怎样让它自动与服务器同步
呢?默认多少分钟跟服务器同步呢?怎样修改同步的时间呢,这时候我们需要配置客户端:
(1) 配置 puppet 相关参数和同步时间:
# vi /etc/sysconfig/puppet 
PUPPET_SERVER=puppet.example.com #puppet master 的地址
PUPPET_PORT=8140 #puppet 监听端口
PUPPET_LOG=/var/log/puppet/puppet.log #puppet 本地日志 
#PUPPET_EXTRA_OPTS=--waitforcert=500  【默认同步的时间,我这里不修改这行参数】
(2) 默认配置完毕后,客户端会半个小时跟服务器同步一次,我们可以修改这个时间。 
# vi /etc/puppet/puppet.conf 
[agent] 
runinterval = 60  #代表 60 秒跟服务器同步一次 
# service puppet reload

时间: 2024-08-01 22:27:03

<Puppet 集中配置管理系统RHEL6>的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: