puppet是一个开源的软件自动化配置和部署工具,很多大型IT公司均在使用puppet对集群中的软件进行管理和部署。
2. 设计架构
- puppet是基于c/s架构的。服务器端保存着所有对客户端服务器的配置代码,在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服务。
3 puppet语法
1 资源
1.常用的资源主要有以下几个:
file:文件管理 更详细资料
package:软件包管理 更详细资料
service:系统服务管理 更详细资料
cron:配置定期任务 更详细资料
exec:运行shell命令 更详细资料
2.资源常用属性
before 用于控制不同对象(资源)的执行顺序关系,表示某个对象(资源)在另一个对象之后发生(require与之相反,它表示之前发生)。
subscribe 检测某个资源,当它发生变化时,该资源会重新加载。
enable 服务在开机的时候是否启动,可以设置的值是true和false,需要provider支持enableable
ensure 是否运行服务, running表示运行服务,stopped 表示停止服务
restart 指定重启脚本,否则就先停止该服务再启动该服务
start 指定启动服务的命令,通常init模式的管理脚本都支持,不需要手工指定
status 指定status命令,如果不指定,就从进程列表查询该服务
stop 指定停止服务的脚本.
2 类和函数
1类
类可以把多个相关的资源定义在一起,组成一个类,类可以继承。
2函数
函数(在puppet中称为“defination”)可以把多个资源包装成一个资源,或者把一个资源包装成一个模型,便于使用。
3 节点
4 变量和数组
1 变量:
- puppet可以使用由facter提交的变量,facter在客户端收集系统信息整理成不同的变量提交给puppet服务器端,服务器端的代码可以使用这些变量实现高级的功能,例如不同的硬件配置生成不同的应用软件配置文件。
-
- 运行facter命令可以看到很多变量的输出,这些变量可以在puppet代码里面直接使用。
2 数组:
5 模块
-
- 一个模块就是一个/etc/puppet/modules目录下面的一个目录和它的子目录,在puppet的主文件site.pp里面用import modulename可以插入模块。新版本的puppet可以自动插入/etc/puppet/modules目录下的模块。
- 引入模块,可以结构化代码,便于分享和管理。例如关于apache的所有配置都写到apache模块下面。
- 一个模块目录下面通常包括三个目录:files,manifests,templates。manifests 里面必须要包括一个init.pp的文件,这是该模块的初始(入口)文件,导入一个模块的时候,会从init.pp开始执行。可以把所有的代码都写到init.pp里面,也可以分成多个pp文件,init 再去包含其他文件。files目录是该模块的文件发布目录,puppet提供一个文件分发机制,类似rsync的模块。templates 目录包含erb模型文件,这个和file资源的template属性有关。
- puppet安装好以后,modules目录是没有的,自己建立一个就行,然后在里面可以新增加你的模块。
4 常用命令
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
|
[root@linuxmaster1poc
~]# puppet help Usage:
puppet <subcommand> [options] <action> [options] Available
subcommands, from Puppet Faces: ca
Local Puppet Certificate Authority management. #管理本地证书 catalog
Compile, save, view, and convert catalogs. #编译、保存、查看puppet代码,或转换成Catalogs certificate
Provide access to the CA for certificate
management. #提供访问CA证书的管理 certificate_request
Manage certificate requests. #管理证书的请求 certificate_revocation_list
Manage the list of revoked certificates. #管理撤销证书的列表 config
Interact with Puppet‘s
configuration options. #配置现象 facts
Retrieve and store facts. #系统信息检查 file
Retrieve and store files in a
filebucket #在filebucket中检索和存储文件 help
Display Puppet help. #查看帮助 instrumentation_data
Manage instrumentation listener accumulated data. #管理监听的数据 instrumentation_listener
Manage instrumentation listeners. #管理监听的状态 instrumentation_probe
Manage instrumentation probes. #管理监听探测 key
Create, save, and remove certificate keys. #创建、保存、删除证书密钥 man
Display Puppet manual pages. #查看手册 module
Creates, installs and searches for modules
on the Puppet Forge. #从Puppet Forge创建、安装、查询模块 node
View and manage node definitions. #管理节点 parser
Interact directly with the
parser. #解析器管理,检查pp文件语法 plugin
Interact with the
Puppet plugin system. #插件管理 report
Create, display, and submit reports. #创建、查看报告 resource
API only: interact directly with resources
via the RAL. #查看资源帮助 resource_type
View classes, defined resource types, and nodes from all manifests. #查看类、默认资源类型与节点信息 secret_agent
Mimics puppet agent. #模拟Agent status
View puppet server status. #查看puppet状态 Available
applications, soon to be ported to Faces: agent
The puppet agent daemon #客户端进程,负责从Master端获取信息 apply
Apply Puppet manifests locally #运行本地manifests cert
Manage certificates and requests #证书颁发,用于签署证书 describe
Display help about resource types #资源帮助 device
Manage remote network devices #管理远程网络设备 doc
Generate Puppet documentation and references #生成puppet文档 filebucket
Store and retrieve files in a
filebucket #在filebucket中检索和存储文件 inspect
Send an inspection report #发送report报告 kick
Remotely control puppet agent #远程控制agent,远程触发puppet agent命令 master
The puppet master daemon #编译配置文件、模板、节点的自定义插件 queue
Queuing daemon for asynchronous
storeconfigs #队列进程 See ‘puppet
help <subcommand> <action>‘ for help
on a specific subcommand action. See ‘puppet
help <subcommand>‘ for help
on a specific subcommand. Puppet
v2. 7.23 |
1、常用命令:
1. `puppet master` #编译配置文件、模板、节点的自定义插件
2. `puppet agent` #客户端进程,负责从Master获取数据
3. `puppet cert` #证书颁发,用于签署证书
4. `puppet kick` #远程控制agent,远程触发puppet agent命令
5. `puppet apply` #运行本地manifests
2、帮助:
1. `puppet doc` #生成puppet文档
2. `puppet help` #显示puppet帮助信息
3. `puppet resource` #查看资源帮助
4. `puppet describe` #资源帮助
5. `puppet status` #查看puppet状态
3、模块和不常用命令:
1. `puppet module` #从puppet forge创建、安装、查询模块
2.` puppet device` #远程管理网络设备
3. `puppet inspect` #发送report报告
4. `puppet filebucket` #在filebucket中检索和存储文件
5. `puppet queue` #队列进程
5 实例操作
启动
[root@testsns opt]# /etc/init.d/puppetmaster start
认证:
客户端发送请求 Puppeted --test –server testsns (testsns为client名称)
服务器查看 Puppetca –list
服务器端签名 Puppetca –s –a //对所有客户端全部签名 Puppetca –s nfstest //只签名某个客户端 (nfs test为client名称)
1文件分发:
通过puppet可以向被管理机上推送文件,方法是使用file类型的source属性
1:修改/etc/puppet/fileserver.conf
2:修改/etc/puppet/manifests/ site.pp
实例:要把server服务器上/opt目录下的mysql-5.1.49-linux-i686-icc-glibc23.tar.gz传输至client服务器的/opt目录下,文件名不变。
第一步:
Vi /etc/puppet/fileserver.conf
[files]
path /opt/
allow 192.168.133.0/24
第二步:
vi /etc/puppet/manifests/site.pp
file
{ "/opt/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz":
source => "puppet://$puppetserver/files/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz",
}
第三步:
在client客户端执行更新命令
puppetd --test --server testsns
此处“$puppetserver”是puppet Server端的名称,即hostname,网上教程都是在hosts里指定。testnsns为client名字
2修改文件属性:
实例:把/tmp/dd142/ puppet-2.6.13.tar.gz文件的权限改为puppet用户,并设置权限为666。
第一步:
编辑Server端的site.pp
vi /etc/puppet/manifests/site.pp
---内容如下
file
{ "/tmp/dd142/puppet-2.6.13.tar.gz":
owner => "puppet",
group => "puppet",
mode => 666,
}
第二步:
在client端执行命令
puppetd --test --server testsns
3执行SHELL命令或shell脚本:
实例:通过puppet分发执行shell脚本,在客户端的opt目录下新建一目录shelldir。
第一步:
编辑Server端的site.pp
vi /etc/puppet/manifests/site.pp
exec { "exec-mkdir":
cwd => "/opt",
command => "sh /opt/lgh.sh",
user => "root",
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
}
第二步:
在client端编辑一shell脚本
vi /opt/lgh.sh
#!/bin/bash
mkdir /opt/shelldir
第三步:
在client端执行命令
puppetd --test --server testsns
4Hello World
实例:一个slave从master中获取其manifest,该maniftest要求slave依次做以下工作:安装gcc,创建文件夹/home/dxc/test,下载文件hello.c程序,编译hello.c。
(1) 假设代码结构组织
Master上代码的目录结构如下:
|– auth.conf
|– fileserver.conf #puppet文件服务器配置文件
|– manifests #puppet主文件所在目录
| |– modules.pp #puppet各个模块汇总
| |– nodes #各个slave要处理的模块
| | `– execHello.pp #hello模块对应由那些slave处理
| `– site.pp #puppet主文件(入口文件)
|– modules #puppet的各个模块所在文件
| `– hello #hello模块
| |– files #该模块对应的文件资源,可能是要发送给slave的配置文件等
| | `– hello.c
| `– manifests #模块的manifest文件
| `– init.pp #模块入口文件
`– ssl #puppet的证书文件目录
(2) 程序执行流程
代码调用顺序是:
Slave发起连接请求 =》site.pp =》nodes =》modules =》init.pp
首先,slave向发起master连接请求,进行证书验证;
接着,证书验证通过后,master会直接找到入口文件manifests目录下的site.pp文件,该文件可能包含一些全局变量,参数缺省值(当各个模块没有设置这些参数时,它们的缺省值)以及其它pp文件的调用(在该例子中,会调用modules.pp和nodes下的各个pp文件);
然后,master通过nodes下的各个pp文件定位到该slave要执行的模块(init.pp是各个模块的入口),汇总这些模块代码返回给slave;
最后,slave根据master发过来的manifest,配置信息。