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