集中化运维管理--Puppet管理之路
@守住每一天
2012年08月22日
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
自我介绍
刘宇
@守住每一天
SinaEdge运维主管
LinuxTone创始人之一
2009年编写Nagios完整配置文档
2011年编写Puppet集中化管理
爱好:骑行
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
运维自动化
系统安装
配置管理
监控报警
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
系统安装
KickStart
Cobbler
... ...
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
配置管理
Cfengine
Puppet
Capistrano
Func
... ...
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
监控报警
Nagios
Zabbix
Ganglia
Cacti
... ...
more
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
运维工作内容
安装系统
系统优化
软件部署及配置
监控部署
打补丁,修复漏洞
配置文件变更
代码下发
... ...
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
自己实现自动化
缺点
•从头造轮子:构建工作的挑战与繁琐
•程序的可维护性无法保障(语言)
•支撑不同的平台
•系统重装后呢?
优点
•随心所欲
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
关系管理
任务型
数据型
资源型
详细请参与:2011年架构师大会 余沛的演讲
其中我们谈得最多的就是资源里的依赖管理
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet VS Chef
Puppet所支持的操作系统:
Chef所支持的操作系统:
Chef使用者:
Puppet使用者:
Puppet Chef
使用用户 Google Admeld
开发支持 Foreman
商业运用 Enterprise 较少吧
程序语言 Php Django ... Ruby 但有中间层
文档环境 Mail-List IRC Mail-List
平台支持 All os 较多的
现成实例 example42
依赖关系 灵活处理
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
比较毫无意义
任何一款软件都有它的优劣式,只要它能满足我们的需求,解决
我们目前或以后可能存在的问题。就可以了。软件的特点大同小
异,但在不同的人手上,发挥出来的特性却大不相同。用你喜欢的
软件 就可以了。
还有更多的软件:fabric cfengine
对于比较有兴趣的可以研究下
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
我推荐的理由
配置简单,容易上手
使用者多,不会就问
不需要程序基础
实例实在是太多了
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
解剖Puppet
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet简介
Puppet是开源的基于Ruby的系统配置管理工
具,依赖于C/S的部署架构。使用跨平台语言
规范,管理配置文件、用户、软件包、系统服
务等。客户端默认每隔半小时会和服务器通信
一次,确认是否有更新。当然也可以配置主动
触发来强制客户端更新。
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
应用场景
统一配置管理软件
统一配置系统优化参数
定期检测服务是否运行
根据机器硬件环境自动配置软件配置(
mem_cache)
快速替换集群时设备的角色
More
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet 架构
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet数据流
puppet客户端在首次启动的时候,也会自动生成证书;但是这个证书需要得到puppet服
务器端的签名才行; puppet客户端在下次连接服务器的时候就会下载签名好的证书.
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
模块、类、资源、模板
modules 模块
class nginx { 类
! package { “nginx”: ensure => installed, } 资源
! file {“/etc/nginx/”: 资源
! ! content =>template(“nginx/”), 模板!
require => Package[“nginx”], } 依赖
}
无论如何你必须弄清楚他们之间的关系。
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet 组织结构
树结构如下:
|-- #主配置配置文件
|-- #文件服务器配置文件
|-- #认证配置文件 (只允许域内认证)
|-- #自动验证配置文件
|-- #邮件配置文件(将错误信息发送)
|-- manifests #文件存储目录(puppet 会先读取该目录的.PP 文件<>)
| --nodes
| | |
| |-- #定义puppet 相关的变量和默认配置。
| |-- #加载class 类模块文件(include nginx)
|-- modules #定义模块
| -- nginx #以nginx 为例
| |-- file
| |-- manifests
| | |-- #class 类配置
| |--- templates #模块配置目录
| | |-- #erb 模板
有人提问问了这个配置
puppet解析主配置文件所有的
模块和节点都在此文件里
include
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Nginx实例
配置一个client主配置文件。它是被所include的。
modules/nginx/manifests/ 配置一个nginx模块
class nginx { 定义⼀一个nginx类。类名必须和模块名匹配
以下定义了三个资源
! package { “nginx”: ensure => installed, }
! service {“nginx”: enable => true, ensure => running,
! ! require => Package[“nginx”] }
! file {“/etc/nginx/”:
! ! source => “puppet:///$fileserver/nginx/”,
require => Package[“nginx”], }
}
node ‘puppetclient’ { include nginx }
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet工作原理
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
针对上图加的文字说明
(1)客户端puppetd向master发起认证请求。或使用带签名的证书。
(2)master告诉client你是合法的。
(3)客户端puppetd调用facter,facter探测出主机的一些变量,例如主机名,内存大小,ip地址
等。pupppetd 把这些信息通过ssl连接发送到服务器端;
(4)服务器端的puppetmaster 检测客户端的主机名,然后找到manifest里面对应的node配置,
并对该部分内容进行解析,facter送过来的信息可以作为变量处理,node牵涉到的代码才解析,其
他没牵涉的代码不解析。解析分为几个阶段,语法检查,如果语法错误就报错。如果语法没错,就继
续解析,解析的结果生成一个中间的“伪代码”(catelog),然后把伪代码发给客户端;
(5)客户端接收到“伪代码”,并且执行。
(6)客户端在执行时判断有没有file文件,如果有向fileserver 发起请求。
(7)客户端判断有没有配置report。如果配置把执行结果发送给服务器;
(8)服务器端把客户端的执行结果写入日志。并可以发送给报告系统(DashBoard)
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet丰富的资源
File
Cron
Service
exec
User / Group
Package
查看更多:puppet describe --list
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet关系管理
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
针对关系管理添加文字说明
puppetd --server --test --graph
ls /var/lib/puppet/state/graphs/
显示资源的类和次结构,但没有依赖关系。
以箭头显示资源之间的依赖关系
一个更详细的版本关系图
dot文件在mac下可以使用omnigraffle直接打开。
如果是非mac 需要使用dot进行格式转换
dot -Tpng /var/lib/puppet/state/graphs/ -o /tmp/
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
获取模块
目前模块都是现成的。网上都有提供。可以git
clone下来自己修改。
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet DashBoard
Puppet Dashboard可以为你的Puppet环境添加一个图形用户
界面(GUI)。Puppet Dashboard可以显示主机上Puppet的
运行结果,并且可以提供一个节点分类工具来配置你的主机。
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet Foreman
第三方开发
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
融合
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet Django
pymodule/
pymodule/
#!/usr/bin/python
#FilenName haproxy modules py
#Write by Liuyu 2010-11-22
def haproxy (nodename,tsname):
contents = '''node '%s'{
$tsname = '%s'
include haproxy
}''' % (nodename,tsname)
return contents
== ha_role:
es_servers = (Q(role=ts_role))
es_ip_str = haproxy_ips_str( [ for i in es_servers] )
config_contents = haproxy(_name,es_ip_str)
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet Django
拿Django实现一个puppet 的WebUI。下图是添加一台
puppet_client
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
当服务器上1000+
服务器越来越多时可能存在的问题:
Master 计算”伪代码”
认证CA
FileServer
网络复杂
Client 并发(runinterval)
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet LoadBlancer
Apache + Passenger
Nginx + Mongrel
nginx 监听port 8140将除文件下发之外的请求,代理转发给上面的4
个puppetmaster实例之一,nginx会对客户端证书进行验证,但需
要配置ca签发的证书才允许请求
我们也可以再配置8141提供证书签发。
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet集群架构
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
集群架构说明
以上集群只是简单采用扩容多master的方案,但ca却只做了热
备,我们可以继续扩展:
1、将CA配置同步到每台机器上,包括公私钥
2、用CA给每台管理机器签发一个证书
3、每台管理机都配成loadbalancer的方式,8140提供配置管
理,8141提供证书签发
4、各管理机之间可以使用keeplived实现高可用性及故障切
换,包括HA等。架构可随意扩展
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
FileServer
/etc/puppet/manifests/
file 资源的三种常见写法
$fileserver = ""
! file {“/etc/nginx/”:
! ! source => “puppet:///$fileserver/nginx/”, } 适合文件不经常变化
! file {“/etc/nginx/”:
! ! content => template("nginx/"), } 适合文件经常变化
! file {“/etc/nginx/”:
! ! content => “Hello World”, } 传参
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
哥们,我着急,配置变更能马上生效吗?
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet Kick
PuppetMaster
More : puppetrun --help
指定客户端马上来服务器端请求更新
listen = true
sudo puppet kick -p 10 -t remotefile -t webserver host1 host2
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Tag Kick
puppet kick -p 10 -t nginxfile puppetclient
当你的类配置tag后,可以指定tag更新
class nginx {
! file {“/etc/nginx/”:
! ! source => “puppet:///$fileserver/nginx/”,
require => Package[“nginx”],
tag => nginxfile,}
}
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet特色
分阶段运行
• cron puppet modules
多环境运行
• production
• development
可视化文档 生成html文档
• puppet doc --all --outputdir=/test --mode rdoc --
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Puppet瓶颈其它解决方案
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Mcollective
MCollective就是一个调度器
解决puppet agent同时向master提出请求造成性能,速
度下降的问题
可以根据不同的属性对节点进行分类,对不同分类执行不
同的任务
它是一个控制终端,可以使用它控制客户端和服务器,因此
可以取消puppet agent定时运行
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
结合puppet
触发Puppet Agent
•mco rpc puppetd runonce
-‐-‐-‐-‐
puppetd#runonce
call
stats
-‐-‐-‐-‐
Nodes:
8
/
8
Pass
/
Fail:
2
/
6
Start
Time:
Fri
Aug
24
14:55:50
+0800
2012
Discovery
Time:
Agent
Time:
Total
Time:
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
合理规划
采用Git管理Puppet
• 进行puppet全代码版本控制
规范HostName
•
• 采用DNS管理
沟通自定义OS
• 将puppetclient 初始化集成
FileServer独立
• 不常更新的文件资源进行独立
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
sina当前架构图
12年8月28日星期二
You are the oneCopyright © 1996-2012 SINA
Thanks && Question
12年8月28日星期二