puppet 是一种Linux、Unix、Windows平台的集中配置管理系统,运维人员或者系统管理员可以通过使用 puppet 来处理所有的管理细节,是自动化运维的工具。
puppet是为了让系统管理员可以相互交流和共享成熟的工具,避免重复的劳动.通过以下两个特性来实现这一目标:
1.提供一个简洁的但是强大的框架来完成系统管理任务
2.系统管理任务可以描述成puppet语言,因此可以相互分享代码,就像分享其他语言的代码一样,比如python, c等
因此,作为系统管理员的你可以更快的完成工作,因为你可以用puppet来处理所有的管理细节. 甚至你还可以下载其他管理员的puppet代码来让你的工作完成的更快.
puppet 是一个 C/S 结构, 当然,这里的 C 可以有很多,因此,也可以说是一个星型结构. 所有的 puppet 客户端同一个服务器端的 puppet 通讯. 每个puppet 客户端每半小时(可以设置)连接一次服务器端, 服务器端保存着所有对客户端服务器的配置代码,在puppet里面叫做manifest. 客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理,用户管理和文件管理等等。
puppet的工作流程如下:
(1)客户端puppetd调用facter,facter探测出主机的一些变量,例如主机名,内存大小,ip地址等。pupppetd 把这些信息通过ssl连接发送到服务器端;
(2)服务器端的puppetmaster 检测客户端的主机名,然后找到manifest里面对应的node配置, 并对该部分内容进行解析,facter送过来的信息可以作为变量处理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,语法检查,如果语法错误就报错。如果语法没错,就继续解析,解析的结果生成一个中间的“伪代码”,然后把伪代码发给客户端;
(3)客户端接收到“伪代码”,并且执行,客户端把执行结果发送给服务器;
(4)服务器端把客户端的执行结果写入日志。
puppet工作过程中有两点值得注意,第一,为了保证安全,client和master之间是基于ssl和证书的,只有经master证书认证的client可以与master通信;第二,puppet会让系统保持在你所期望的某种状态并一直维持下去,如检测某个文件并保证其一直存在,保证ssh服务始终开启,如果文件被删除了或者ssh服务被关闭了,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。
实验环境:rhel6.5, server4为主机,server5,server6为从机,各机hostname相互解析且时间同步。
安装
server4
#yum install -y puppet-server puppet facter hiera rubygem-json ruby-shadow ruby-augeas rubygems openssl
从机上
#yum install -y puppet facter hiera rubygem-json ruby-shadow ruby-augeas rubygems openssl
server4
/etc/puppet 配置目录:
组织结构如下:
|-- puppet.conf #主配置配置文件,详细内容可执行 puppet --genconfig
|-- fileserver.conf #文件服务器配置文件
|-- auth.conf #认证配置文件
|-- autosign.conf #自动验证配置文件
|-- tagmail.conf #邮件配置文件(将错误信息发送)
|-- manifests #文件存储目录(puppet 会先读取该目录的.PP 文件<site.pp>)
#touch /etc/puppet/manifest/site.pp //没有此文件 puppet master 无法启动,配置后面再定义
#/etc/init.d/puppetmaster start
#puppet cert list --all
server6
#/etc/init.d/puppet start
#puppet agent --server server4.example.com --no-daemonize -vt
//client 向 master 发出证书验证请求,然后等待 master 签名并返回证书。
参数--server 指定了需要连接的 puppet master 的名字或是地址,默认连接名为“puppet”的主机
如要修改默认连接主机可以修改/etc/sysconfig/puppet 文件中的 PUPPET_SERVER=puppet 选项
参数--no-daemonize 是 puppet 客户端运行在前台
参数--vt v指verbose使客户端输出详细的日志 t指test测试
提示没有证书。需要在master上注册证书
server4上
#puppet cert sign server6.example.com
server6
#puppet agent --server server4.example.com --no-daemonize -vt
证书连接成功
开启自动验证
server4上
#vim /etc/puppet/puppet.conf
在[main]下添加
autosign=true //允许所有客户端的认证
#cd /etc/puppet
#vim autosign.conf
*.example.com //允许所有 example.com 域的主机
#/etc/init.d/puppetmaster reload
server5
#puppet agent --server server4.example.com --no-daemonize -vt
自动注册成功
server4上
#puppet cert list --all
在实际中有时会修改 client 端的主机名,这样就需要重新生成证书
清除server从机的证书
server4上
#puppet cert clean server6.example.com //清除server6的证书
server6上
#rm -fr cd /var/lib/puppet/ssl/*
puppet 资源定义
server4上,
#cd /etc/puppet/manifests
#vim site.pp
file {
‘/tmp/testfile‘:
content => ‘www.westos.org‘
}
server5
#puppet agent --server server4.example.com --no-daemonize -vt
#cat /tmp/testfile
server4
还可在site.pp中添加
mode => 600 表示文件为600权限,
owner => puppet 所有者为puppet,
group => puppet 所有组为puppet
#cd /etc/puppet
#mkdir files
#vim fileserver.conf //文件服务器配置文件
在最后添加
path /etc/puppet/files //定义pp文件中files路径
allow *.example.com //允许所有 example.com 域的主机
#/etc/init.d/puppetmaster reload
#vim /etc/puppet/manifests/site.pp
添加
file {
‘/tmp/passwd‘:
source => ‘puppet:///files/passwd‘
}
package {
‘httpd‘:
ensure => present //软件包定义
}
service {
‘httpd‘:
ensure => running, //服务定义
require => Package [‘httpd‘] //启动依赖Package模块,定义启动的先后顺序
}
更改pp文件无需reload puppetmaster服务。
server5
#puppet agent --server server4.example.com --no-daemonize -vt
可看到httpd以安装,启动。/tmp/passwd文件以创建
server4中site.pp
添加
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:/bin", //定义动作,给test用户添加密码
onlyif => ‘id test‘ //当test存在时模块exec才生效
}
server6
#puppet agent --server server4.example.com --no-daemonize -vt
文件系统挂载
在site.pp上
file {
"/public":
ensure => directory
}
mount {
"/public":
device => "172.25.0.251:/var/ftp/pub",
fstype => "nfs",
options => "defaults",
ensure => mounted //自动挂载文件系统,并同步 fstab 文件,如果需要卸载,改为 absent
}
package {
"nfs-utils","httpd":
ensure => present
}
真机(ip:172.25.0.251)上
#yum install -y nfs-utils
#/etc/init.d/nfs start
server6上
#puppet agent --server server4.example.com --no-daemonize -vt
#cat /etc/fstab
crontab 任务
在site.pp上
cron { echo:
command => "/bin/echo `/bin/date` >> /tmp/echo",
user => root,
hour => [‘2-4‘],
minute => ‘*/10‘
}
任务会在 client 上/var/spool/cron 目录中生成。
server6
添加vsftpd模块
server4
#mkdir /etc/puppet/modules/vsftpd
#cd /etc/puppet/modules/vsftpd
#mkdir manifests
#mkdir files
#cd files
#yum install vsftpd
#cp /etc/vsftpd/vsftpd.conf .
#chmod 644 vsftpd.conf
#cd ../manifests
#touch install.pp config.pp service.pp init.pp
结构:
#vim init.pp
class vsftpd {
include vsftpd::install,vsftpd::config,vsftpd::service
}
#vim install.pp
class vsftpd::install {
package {
‘vsftpd‘:
ensure => present
}
}
#vim config.pp
class vsftpd::config {
file {
‘/etc/vsftpd/vsftpd.conf’:
source => ‘puppet:///modules/vsftpd/vsftpd.conf’, //实际路径在/etc/puppet/modules/vsftpd/files/vsftpd.conf
mode => 600,
require => Class[‘vsftpd::install’],
notify => Class[‘vsftpd::service’]
}
}
#vim vsftpd::service {
service {
‘vsftpd’:
ensure => runnig,
require => Class[‘vsftpd::install’,’vsftpd::config’]
}
}
#cd /etc/puppet/manifest
#mkdir nodes
#vim nodes/server5.pp //nodes目录下可以创建多个节点文件
node ‘server5.example.com {
include vsftpd
package {
‘httpd‘:
ensure => present
}
service {
‘httpd‘:
ensure => stopped,
require => Package[‘httpd‘]
}
}
#vim site.pp
改成如下
import ‘nodes/*.pp‘ //包含nodes/下的pp文件
file {
‘/tmp/testfile‘:
content => ‘www.westos.org‘,
mode => 600,
owner => puppet,
group => puppet
}
#service puppetmaster reload
server5
#puppet agent --server server4.example.com --no-daemonize -vt
显示vsftpd启动成功
添加appache模块
server4
#cd modules
#cp vsftpd httpd
#cd httpd/files
#cp /etc/httpd/conf/httpd.conf .
#rm -fr vsftpd.conf
#cd ../manifests
在 init.pp,service.pp,config,install.pp中
将vsftpd换成httpd
#mkdir ../templates //用于存放模版应用
#vim /etc/puppet/modules/httpd/templates/httpd_vhost.erb //添加模版,必须以*.erb结尾,这里添加的是httpd的虚拟主机模版
<VirtualHost *:80>
ServerName <%= domainname %>
DocumentRoot /var/www/<%= domainname %>
ErrorLog logs/<%= domainname %>_error.log
CustomLog logs/<%= domainname %>_access.log common
</VirtualHost>
#cd /etc/puppet/manifests/
#vim init.pp
define httpd::vhost($domainname) {
file { "/etc/httpd/conf.d/${domainname}_vhost.conf":
content => template("httpd/httpd_vhost.erb"),
require => Class["httpd::install"],
notify => Class["httpd::service"]
}
file { "/var/www/$domainname":
ensure => directory
}
file { "/var/www/$domainname/index.html":
content => $domainname
}
}
#vim /etc/puppet/manifests/nodes/server5.pp
node ‘server5.example.com’{
include vsftpd,httpd
httpd::vhost {
‘www.example.com’:
domainname => “www.example.com”,
}
}
#vim /etc/puppet/module/httpd/files/httpd.conf
将最后几行修改为
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName server5.example.com
</VirtualHost>
server5
#puppet agent --server server4.example.com --no-daemonize -vt
显示httpd启动
真机(浏览器使用的是真机)添加解析
172.25.0.4 www.example.com
原文地址:http://simplelinux.blog.51cto.com/5505221/1813885