一、概述
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 初始化环境:
1
2
3
4
|
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
|
1
2
3
4
5
6
|
设置主机直接可以通过主机名相关访问,在三台主机修改
/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端安装配置
1
2
|
rpm -ivh
yum
install
-y puppet-server facter puppet
|
编辑/etc/puppet/puppet.conf
1
2
3
4
5
6
7
8
9
10
11
|
[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认证服务器名称
|
1
2
|
/etc/init
.d
/puppetmaster
start
chkconfig puppetmaster on
|
查看端口和进程
2.3 agent端安装配置
1
2
|
rpm -ivh
yum
install
-y puppet facter
|
编辑/etc/puppet/puppet.conf
1
2
3
4
5
|
[agent]
classfile = $vardir
/classes
.txt
localconfig = $vardir
/localconfig
certname = puppet-2
#设置本机的certname名称
server = puppet-server
#指向puppetmaster进行身份验证
|
启动服务
1
|
/etc/init
.d
/puppet
start
|
2.4 证书签发
在master端查看证书
没有带“+”说明没有进行身份验证
1
2
3
|
puppet cert --sign puppet-1 签发证书
puppet cert --sign puppet-2
#puppet cert clean puppet-2 清理证书
|
在agent端验证
三、puppet文件资源
3.1 /etc/puppet配置目录:
1
2
3
4
5
6
7
8
9
10
11
12
|
[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 模块目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
模块:目录结构
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命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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资源清单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
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资源引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
元参数:用于定义资源间的依赖关系,及应用次序,通知机制等等
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表达式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
puppet的条件表达式
if
单分支
双分支
多分支
if
条件 {
动作
} elsif 条件 {
动作
}
else
条件 {
动作
}
case
:指定代码块
selectors:返回结果
|
四、验证
编辑资源清单,在puppet-1安装nginx,puppet-2安装mysql并设置开机自启动
在agent端测试手动执行,(默认三十分钟agent自动去master拉取)
五、puppet dashboard安装配置
5.1 安装并配置mysql数据库
1
2
3
|
yum
install
-y ruby-mysql mysql-server
service mysqld start
mysqladmin -uroot password
"mysqladmin"
|
创建数据库并授权
1
2
3
4
|
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
1
2
|
yum -y
install
puppet-dashboard
vim
/usr/share/puppet-dashboard/config/database
.yml
|
1
|
vim
/usr/share/puppet-dashboard/config/environment
.rb
|
导入数据库文件
1
2
3
|
cd
/usr/share/puppet-dashboard/
rake gems:refresh_specs
rake RAILS_ENV=production db:migrate
|
5.3 启动服务,并测试访问
1
2
|
/etc/rc
.d
/init
.d
/puppetmaster
start 启动服务
http:
//IP
:3000 浏览器进行访问
|
手工导入报告
1
2
|
cd
/usr/share/puppet-dashboard/
rake RAILS_ENV=production reports:
import
|
启动报告
1
|
env
RAILS_ENV=production
/usr/share/puppet-dashboard/script/delayed_job
-p dashboard -n 4 -m start
|
查看进程job
查看dashboard