Puppet 应用案例 吴问志 网站 :www.mysqlops.com/category/puppet 邮箱 : puppetfans@sina.com 微博 :puppetfans@sina.com
引言 机器越来越多 架构越来越复杂 应用越来越多且复杂 审记越来越难
内容概要 1.puppet 介绍 - 什么是 puppet - puppet 能做什么 - puppet 如何做到 - puppet 主要概念 2.puppet 基础 - puppet 基本语法 - puppet 目录结构 - puppet 命名规范 - puppet 日常使用 - puppet 使用注意事项 3.puppet 应用案例 -puppet 管理用户 -puppet nginx 管理 -puppet kick 介绍 4.puppet 架构与集群 -puppet 架构 -puppet 集群方案 - puppet 集群核心思想 -puppet 性能测试方法 5. QA -puppet 未来
puppet 介绍 什么是 puppet 遵循 GPL 协议 (2.7.0 以前 ), 基于 ruby 语言开发的系统配置管理工具 OOP facter 常用于 C/S 架构, 配置客户端和服务端, 也可以独立运行 puppet 对于系统管理员是抽象, 只依赖于 ruby 与 facter. facter -tp kernel: 18.76ms hostname: 19.05ms 默认情况下客户端每隔 30 分钟连接到 puppet 服务端 puppet 能做什么 puppet 能管理多达 40 多种资源, 例如 file, package, service,cron,exec
Facter 介绍 Facter 是什么 facter 是内置的 puppet 工具, 它提供的一个标准方式去获得客户端环境变量等相关信息 Facter 能获得哪些信息 #facter -p architecture => x86_64 id => root interfaces => eth0,lo ipaddress => 192.168.200.63 ipaddress_eth0 => 192.168.200.63 ikernprocessor0 => Intel(R) Xeon(R) CPU E5405 @ 2.00GHz prouptime => 27 days uptime_days => 27 uptime_hours => 651 uptime_seconds => 2344200 注 : 这些变量可以直接来使用, 例如 : {$::ipaddress 或者 $::ipaddress 当然你也可以自定义 fact, 需要使用 ruby 来编写
puppet 是如何工作的
puppet 工作流程 注 : 内部处理过程是抽象的
Puppet 主要概念 Puppet 参考模型 package { "nginx": ensure => installed,
Puppet 命名规范 $test= Test $string= puppetfans class { nginx::vhost:8081 : 使用 split 创建数组 : $package = puppet puppet-server ruby-doc" $soft = split($package, ) 变量名必须要小写字母开头, 可以包含下划线, 数字, 大写字母也可以以 :: 来分隔 例 :notify ${test ${::test scope.lookupvar ( test ) 不可以使用 puppet 保留的关键字 例如 :if..else,true, undef,string 类名 : 建议以名称加功能来区分不可以使用保留的类名 :main,settings 模块名一定要包括类名模块是代码和数据的结合, 所有 manifest 文件都属于模块, 唯一例外的是 site.pp define VS class define 用来函数来管理资源,define 可以建个实例, 但实例名称不能相同, 而且不需要 include 任意资源 class 是资源的集合, 类可以 include 多次
Puppet 基础 单个类 :class ntp { 类继承 :class nginx80 inherits nginx {... 选择器 : $systemtype = operatingsystem? { "Ubuntu" => "debianlike", "RedHat" => "redhatlike", 数组 : $package = [ ruby","ruby-doc"] hash: $name1 = { ou => sh,co=> bj case 语句 : case $operatingsystem { "Debian": { include debianlike "RedHat", "CentOS": { include redhatlike 条件语句 : if $username == "puppetfans" { notice("running by puppetfans") else { notice("running by others.") 变量 : $test= puppetfans
puppet 目录结构与模块介绍 puppet 目录结构 ( 右一 ) 注 :manifests/site.pp 必须存在 puppet 模块结构 ( 右二 ) files: 发布的静态文件 manifests: 告诉模块是如何工作的 templates: 基于 ruby 的动态模板 lib: 有关 ruby 的库 注 : manifests/init.pp 必须存在
Puppet 日常使用 一般用法 puppet agent --test --server hostname Puppet agent --test Exec { command=> ps -ef grep 'puppet agent' grep -v grep awk {'print \$2' puppet agent test server --tags nginx puppet kick -p 10 host hostname 调试用法 puppet agent --test --server hostname -- debug --trace 调试输出 puppet agent --test --noop 预运行 puppet apply -e include class { test : 执行单个类 notify { hi,puppetfans 输出到屏幕 notice { running on node $fqdn" 输出到日志 /var/log/message Exec { withpath => true, logoutput => on_failure, 输出资源完整路径并记录执行错误输出
Puppet 使用注意事项 1.puppet 主机名需要规范, 使用 DNS 或者 hosts 解析 2.C/S 两端时间要同步,SSL 认证依赖于时间 3.ssl 认证过后, 请不要修改主机名 4.Usecachefaiure 5.tag 和 tagged 6. 节点可以继承, 但不能多重继承 7. 类可以继承与覆盖, 子类可以向父类添加额外属性值 8.puppet 支持多环境部署 ( 分 : 开发 测试 线上 ) 9.tidy 资源中多条件关系是或者, 而不是 and 10. 选择正确的版本
Puppet 使用时注意事项 1. 节点设置 tag tag("old-slow-server") if tagged("old-slow-server") { notify { "this will succeed": 2. 对资源设置 tag 1, 类继承示例 class nginx::port81 inherits nginx {... 错误示例 class nginx::port81 inherits nginx,apache {... file { "/etc/ssh/sshd_config":... notify => Service["ssh"], tag => "ssh", # puppet agent --test --tags ssh 子类向父类添加额外属性 Service["nginx"] { require +> File[/"etc/nginx/conf.d/nginx81. conf"],
Puppet 的应用案例 Puppet 管理用户 ( 关于 : 管理用户的几点说明 1 a. puppet 支持 ldap 以及 nis 集中认证 2 b.puppet 支持用户密码管理, 最好以 ''( 单引号 ) 括起来 3 c. puppet 创建用户的默认是不建用户家目录的, 需要使用 managerhome=>true d. 可以结合其它资源类型, 实现批量增加用户或者删 ; 除用户 ssh key 例 :ssh_authorized
puppet 虚拟资源 以 @ 为前缀 使用虚拟资源需要配置 storeconfig 虚拟资源使用场景 多个资源需要引用共同的某个资源实例, 例如 A 用户是 SA, 又是 DBA
puppet nginx 应用案例 Exec 有条件的执行 : creates: 指定命令所生成的文件那么命令只会在所指定的文件不存在的情况的被执行 unless: 所设定的命令返回 0 时才执行 onlyif: 只会在 onlyif 设定的命令返回 0 时才执行 refreshonly: 触发刷新动作 资源之间依赖关系 : before after require notify subscribe Refreshonly 和 refresh 的区别 refreshonly: 收到多少次通知, 就执行多少资源 refresh: 不管有多少次通知, 请执行一次
puppet +kick puppet kick: 主动强制客户端运行 puppet agent. 注意 :puppet kick 并不关心客户端 puppet agent 有没有执行错误, 它成功 连接到 agent 即返回退出 0.
Puppet 架构与集群 Puppet 普遍部署为 C/S 架构 : Puppet 成熟的集群方案 : 1.Puppet +nginx 2.Puppet +passenger 3.Puppet +mongrel 4.Puppet+git( 特殊 )
Puppet 架构与集群 Puppet 集群核心思想 : 1).puppetmaster 集群 - 分担 puppetmaster 来自于客户端的请求压力, 可以采取 Active,Active 模式. - 采取反向代理模式, 将来自于 8140 的端口请求分散到多台 puppetmaster 2).puppet ssl 证书集群 - 分担 puppetmaster 来自于客户端 ssl 证书的请求压力, 采取 Active,Standby 模式. 3). 采取独立运行模式, 通过 git 将代码 push 到客户端, 客户端本地执行 相应代码
Puppet 架构与集群 a.puppetmaster 集群架构图
Puppet 架构与集群 puppetca 集群架构图 :
puppetmaster 并发性能测试方法 默认 :centos 系列 puppet-load.rb 在 /usr/share/puppet/ext 目录下 测试 puppetmaster 性能 :./ext/puppet-load.rb - --debug --node client2.test.com --server puppet1 -- factsdir=/var/lib/puppet/yaml/facts --concurrency 1 --repeat 1 --cert /var/lib/puppet/ssl/certs/puppet1.pem --key /var/lib/puppet/ssl/private_keys/puppet1.pem 参阅 : http://www.masterzen.fr/2010/10/18/benchmarking-puppetmaster-stacks/
puppet 未来 项目地址 : https://github.com/puppetlabs/puppetlabs-openstack https://github.com/bcarpio/puppet-hadoop https://github.com/jamtur01/puppetlabs-cloudfoundry https://github.com/puppetlabs/razor
puppet 应用 QA 1. 客户端是如何使用? node default { include nginx 2. 文件备份 a.backup 决定文件的内容在被修改前是否进行备份 b. 文件服务器 a. 默认是备份到远程 filebucket { main: server => "puppet" File { backup => main 默认保存在 / /var/lib/puppet/clientbucket b. 备份到本地 filebucket { 'sky' : path=>"/data/backup", File { backup=>sky 文件备份示例 : file { "/etc/sudoers": mode => "440", source => "puppet:///modules/admin/sudoers", backup => ".bak", 恢复 :( 哈希值 ) cp /var/lib/puppet/clientbucket/c/0/7/ d/0/a/a/2/c07d0aa2d43d58ea7b5c5307f5 32a0b1/contents /etc/sudoers puppet 同步大文件可以使用 rsync 模块