Puppet集中管理系统
Puppet集中管理系统
sunleijoan 发表于3年前
Puppet集中管理系统
  • 发表于 3年前
  • 阅读 27
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: puppet是一个配置管理工具, 典型的, puppet是一个C/S结构, 当然,这里的C可以有很多,因 此,也可以说是一个星型结构. 所有的puppet客户端同一个服务器端的puppet通讯. 每个 puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配 置文件来配置服务器. 配置完成以后,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.westos.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

共有 人打赏支持
粉丝 8
博文 8
码字总数 13759
×
sunleijoan
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: