共计 9386 个字符,预计需要花费 24 分钟才能阅读完成。
一、概述
1.1 puppet 的概念
Puppet 是一款使用 GPLV2X 协议授权的开源管理配置工具,用 Ruby 语言开发。其既可以通过客户端–服务器的方式运行,也可以独立运行。Puppet 可以为系统管理员提供方便、快捷的系统自动化管理。对于系统管理员来说通过 Puppet 配置管理系统,底层的操作系统的发行版本是透明的,Puppet 通过(Provider 又称提供者)属性来完成软件的配置与安装,管理员不必关心操作系统的种类与发行版本,
Puppet 还可以提供一个强大的框架来完成系统管理功能,在框架的基础上系统管理员可以通过 Puppet 语言来描述系统的一些事务,如安装软件、初始化系统、启动、删除服务、推送配置文件和差异化配置管理服务器等。同时系统管理员和系统管理员之间可以分享用 Puppet 语言描述好的事务,从而减少重复劳动,提高工作效率。
1.2 puppet 工作模型
a. 部署调度
puppet master 在一台服务器以守护进程方式运行,同时也包含客户端各节点的配置信息,puppet agent 在与 master 的通信过程中,通过标准的 SSL 协议进行加密和验证,验证通过后,agent 从 masteer 上读取响应节点信息应用在本地。
b. 配置语言和资源抽象
puppet 使用描述性语言来定义配置项,在 puppet 中将配置项被称为 resource,当 Agent 连接 Master 时,Master 并不知道 Agent 的操作系统型号和版本。Agent 通过 Facter 工具收集系统相关信息,并通过 SSL 协议将 Agent 的信息传递给 Master。Master 根据 Agent 收集到的相关信息,通过资源的提供者来为 Agent 服务。比如 Package 资源收到 Agent 的信息后,会识别 Agent 的系统型号版本,并通过资源提供者(如 yum aptitude pkgadd apt-get 等)匹配,为 Agent 服务。
c. 事物层
Puppet 事务层其实就是它的解析引擎。Puppet 事务层配置每一台主机的过程包括:
解析和配置编译。
将编译好的配置同步到 Agent。
在 Agent 上应用配置。
向 Master 报告运行结果。
首先 Puppet 会创建一个图表来表示所有资源的关系和上下游执行顺序,以及和 Agent 的关系。然后
Puppet 将按照资源之间的关系和上下游顺序依次执行。
接着 Puppet 为每一个 Agent 获取相应的资源,并把它们编译成“目录”,然后将目录依次分发到各
主机,并通过 Agent 来应用它们,最后应用结果以报告形式反馈给 Master。
1.3 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. 服务器端把客户端的执行结果写入日志,并发送给报告系统。
二、安装部署
主机清单
主机名 | IP 地址 | 系统 |
puppet-master | 172.20.4.50 | CentOS release 6.9 (Final) |
puppet-1 | 172.20.4.51 | CentOS release 6.9 (Final) |
puppet-2 | 172.20.4.52 | CentOS release 6.9 (Final) |
2.1 初始化环境:
yum
install
ntpdate -y && ntpdate time1.aliyun.com
# 同步时间
service iptables stop
# 关闭 iptables
sed
-i
"s/SELINUX=enforcing/SELINUX=disabled/"
/etc/selinux/config
# 关闭 selinux
setenforce 0
设置主机直接可以通过主机名相关访问,在三台主机修改 /etc/hosts
文件
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.20.4.50 puppet-server
172.20.4.51 puppet-1
172.20.4.52 puppet-2
2.2 master 端安装配置
rpm -ivh
yum
install
-y puppet-server facter puppet
编辑 /etc/puppet/puppet.conf
[main]
logdir =
/var/log/puppet
rundir =
/var/run/puppet
ssldir = $vardir
/ssl
[agent]
classfile = $vardir
/classes
.txt
localconfig = $vardir
/localconfig
certname = puppet-server
# 设置本机的 certname 名称
server = puppet-server
# 设置指向 puppetmaster 进行身份验证
[master]
certname = puppet-server
### 设置 puppetmaster 认证服务器名称
/etc/init
.d
/puppetmaster
start
chkconfig puppetmaster on
查看端口和进程
2.3 agent 端安装配置
rpm -ivh
yum
install
-y puppet facter
编辑 /etc/puppet/puppet.conf
[agent]
classfile = $vardir
/classes
.txt
localconfig = $vardir
/localconfig
certname = puppet-2
# 设置本机的 certname 名称
server = puppet-server
# 指向 puppetmaster 进行身份验证
启动服务
/etc/init
.d
/puppet
start
2.4 证书签发
在 master 端查看证书
没有带“+”说明没有进行身份验证
puppet cert --sign puppet-1 签发证书
puppet cert --sign puppet-2
#puppet cert clean puppet-2 清理证书
在 agent 端验证
三、puppet 文件资源
3.1 /etc/puppet 配置目录:
[root@puppet-server ~]
# tree /etc/puppet/
/etc/puppet/
├── auth.conf
# 认证配置文件
├── environments
│ └── example_env
│ ├── manifests
│ ├── modules
│ └── README.environment
├── fileserver.conf
├── manifests
# 文件存储目录(puppet 会先读取该目录的.PP 文件 <site.pp>)
├── modules
# 定义模块
└── puppet.conf
## 主配置配置文件, 详细内容可执行 puppet --genconfig
3.2 模块目录结构
模块:目录结构
module_name/
manifests/
init.pp: 包含一个与模块名称同名的类
*.pp: 一个清单文件通常只包含一个类,而且建议清单文件名与类名相同 nginx::web 文件名为 web.pp
web/
*.pp
访问路径:module_name::mainfest_file_name,module_name::subdir_name::manifest_file_name
files/
访问路径:puppet:
///modules/module_nname/file_name
nginx_web/
puppet:
///modules/module_name/subdir/file_name
templates/
*.erb: 使用模块函数 template()装载并运行其中模块语言,运行后会生成静态文件
访问路径 templates(‘moduleName
/templates
’)
lib/
用户自定义的插件目录
tests/
当前模块的使用说明和样例
spec/
为 lib 目录中的插件提供使用说明和样例
在模块根目录下,通常还应该具有几个文档
LICENSE
Modulefile
README
3.3 puppet 命令
puppet 命令总结
apply,agent,master,cert,describe
apply:应用本地清单文件
agent:客户端进程
master:服务端进程
cert:证书管理
describe:资源帮助信息
module:模块管理
kick:master 触发模式
帮助类命令
describe
doc:生成 puppet 文档
help:查看帮助
resource:查看资源帮助
status:查看 puppe 状态
master 命令的选项
--no-daemonize:非守护进程
--daemonize:-D
--debug -d
--verbase -
v
--genconfig
agent 命令的常用选项
--daemonize,-D
--no-daemonize
--debug -d
--verbose -
v
--noop:no operation 模式,不真正应用 catalog
--
test
:测试
--waitforcert:等待证书签署成功
apply 命令的常用选项
--debug -d
--verbose -
v
--execute -e
--modulepath
cert 命令的常用操作
list
sign:签署
clean:清除证书
revoke:吊销证书
verify:验证本地指定的证书
generate:为客户端生成证书
3.4 puppet 资源清
puppet 资源
type
{
'title'
:
attibute => value,
}
而资源定义的核心也可以抽象为
type
、title、attribute 和 value 四个部分。
type
分类:
package:
puppet 支持使用的软件包管理器
yum,rpm,apt,ports,gem,msi,dpkg,pkg
常用的参数
ensure:程序包的目标状态
name:资源的名称,即软件包的名字
provider:软件包管理器
source
:指定程序包文件路径
install_options:安装选项,最常用的是通过 INSTALLDIR 来制定安装目录
window 下安装 mysql
package{‘mysql:
ensure =>
install
,
provider =>
'msi'
,
source
=>
'D:\software\mysql-5.5.36.msi'
,
install_options => {
'INSTALLDIR'
=>
'c:\mysql'
},
}
service:
常用参数:
ensure:服务的目标状态,ture(启动)和
false
(关闭)
enable
:是否开机自动启动,ture(启动)和
false
(关闭)
name:服务名称
path:服务脚本路径;默认为
/etc/init
.d 下查找
start:定制启动命令
stop:关闭
restart:重启
status:状态
资源名称仅是一个字符串,在同一个类型中必须唯一
在定义时,资源类型必须是小写字母
file
:
管理文件、目录、软链接;
生成文件内容
管理文件权限、属性
也可以通过
source
属性到指定位置下载文件
通过 recurse 属性来获取目录
常用参数:
ensuce:absent(不存在)present(存在)
file
(文件)directory(目录)
backup:通过 filebucket 资源来备份文件,值通常为 filebucket 资源的名称
content:文件内容,生成方式有三种(content,
source
,target),彼此互斥
source
:通过制定的 url 下载文件至本地,获取文件方式为 puppet url 格式:puppet:
///modules/MODULE_NAME/file_names
;
target: 为符号链接指定目标
links:文件为符号链接,值为“follow”,“manage”
path: 文件路径,必须使用双引号
mode:定义权限
owner:定义属主
group:定义属组
force: 强制执行删除文件、连接或目录,仅用于 ensure 为 absent 时。
purge:清空指定目录中存在的,但未在资源中定义的文件;
recurse:目录递归,值
true
,
false
,inf,remote
replace:替换,本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否;
exec
:
执行命令,通常在不得不用时才使用,慎用,通常用于完成 puppet 自身无法完成的功能
常用的参数:
command
:要执行的命令,通常为命令文件的完整路径
path:命令搜索路径
group:执行命令的组
user:执行命令的用户
onlyif:0,表示仅在命令的状态返回值为 0 时才执行此命令
refresh:定义接受到其他资源的通知时,则要重新执行此命令
refreshonly:仅当被依赖的资源发生改变时才被触发
tries:尝试次数,默认为1
try_sleep:多次尝试之间的时间间隔
group:管理系统上的用户组
常用参数
ensure:目标状态,present,absent
name: 组名
gid:GID
system:系统组
user:管理用户
常用属性:
ensure:目标值状态
name:
uid:
system:
home:
shell:
gid:
password:加密后的密码
managehome:
true
,
false
(默认)
cron
:定义周期性任务
常用属性
ensure:目标状态
command
:命令或脚本
environment:运行时的环境变量
hour:
minute:
mouth:
monthday
weekday
name
user:默认为 root
cron
{
'ntpdate'
ensure => present,
command
=>
'/usr/sbin/ntpdate 172.16.0.1'
&>
/dev/null
minute =>
'*/3'
}
3.5 puppet 资源引用
元参数:用于定义资源间的依赖关系,及应用次序,通知机制等等
require:表示需要依赖
package {
'nginx'
ensure => present,
}
service{
'nginx'
ensure =>ture,
enable
=>ture
require =>Package[
'nginx'
]
}
before: 先应用本资源
package {
'nginx'
ensure => present,
before =>Service [
'nginx'
]
}
service{
'nginx'
ensure =>ture,
enable
=>ture
}
notify: 将当前资源的变动信息通知给别的资源,通知发出者
subscribe:定义在后一个资源中,通知接收者,订阅
资源引用:
使用 Type[
'title'
],首字母必须大写
依赖关系
package {
'nginx'
ensure => present,
} ->
service{
'nginx'
ensure =>ture,
enable
=>ture
restart =>
'/etc/rc.d/init.d/nginx reload'
}
-> 表示依赖
~> 表示通知
3.6 puppet 表达式:
puppet 的条件表达式
if
单分支
双分支
多分支
if
条件 {
动作
} elsif 条件 {
动作
}
else
条件 {
动作
}
case
:指定代码块
selectors:返回结果
四、验证
编辑资源清单,在 puppet- 1 安装 nginx,puppet- 2 安装 mysql 并设置开机自启动
在 agent 端测试手动执行,(默认三十分钟 agent 自动去 master 拉取)
五、puppet dashboard 安装配置
5.1 安装并配置 mysql 数据库
yum
install
-y ruby-mysql mysql-server
service mysqld start
mysqladmin -uroot password
"mysqladmin"
创建数据库并授权
create database dashboard character
set
utf8;
create user
'puppet'
@
'localhost'
identified by
'puppetadmin'
;
grant all on dashboard.* to puppet@
'localhost'
;
flush privileges;
5.2 安装并配置 puppet-dashboard
yum -y
install
puppet-dashboard
vim
/usr/share/puppet-dashboard/config/database
.yml
vim
/usr/share/puppet-dashboard/config/environment
.rb
导入数据库文件
cd
/usr/share/puppet-dashboard/
rake gems:refresh_specs
rake RAILS_ENV=production db:migrate
5.3 启动服务,并测试访
/etc/rc
.d
/init
.d
/puppetmaster
start 启动服务
http:
//IP
:3000 浏览器进行访问
手工导入报告
cd
/usr/share/puppet-dashboard/
rake RAILS_ENV=production reports:
import
启动报告
env
RAILS_ENV=production
/usr/share/puppet-dashboard/script/delayed_job
-p dashboard -n 4 -m start
查看进程 job
查看 dashboard
Puppet 学习系列:
Puppet 学习一:安装及简单实例应用 http://www.linuxidc.com/Linux/2013-08/88710.htm
Puppet 学习二: 简单模块配置和应用 http://www.linuxidc.com/Linux/2013-08/88711.htm
相关阅读:
有关 Puppet agent 端三种备份恢复方案探讨研究 http://www.linuxidc.com/Linux/2013-07/87885.htm
选择更安全的方式注册你的 Puppet 节点 http://www.linuxidc.com/Linux/2013-07/87884.htm
通过配置 SSH 深刻理解 Puppet 的语法及工作机制 http://www.linuxidc.com/Linux/2013-07/87882.htm
Puppet 利用 Nginx 多端口实现负载均衡 http://www.linuxidc.com/Linux/2013-02/79794.htm
CentOS(5 和 6)下 Puppet 的 C / S 模式实例 http://www.linuxidc.com/Linux/2011-12/50502.htm
自动化运维工具 Puppet 快速入门 http://www.linuxidc.com/Linux/2016-12/137893.htm
CentOS 7 下安装配置 Puppet http://www.linuxidc.com/Linux/2017-02/140932.htm
Puppet 的详细介绍:请点这里
Puppet 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149672.htm