一、puppet是什么?
puppet是一个IT基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期:供应(ProVicioning)、配置(configuretion)、联动(orchestration)以及报告(reporting)
puppet基于ruby语言开发,可实现自动化重复任务、快速部署关键性应用以及在本地或者在云端完成注定管理变更和快速扩展架构规模等。
二puppet的工作原理
Puppet的目录是让管理员只集中于要管理的目标,而忽略实现的细节。Puppet即可以运行在单机上,也可以以C/S结构使用。在大规模使用puppet的情况下,通常使用C/S结构,在这种结构中puppet客户端只运行puppeclient,puppet服务端只运行puppemaster。
三、puppet工作的具体过程
①客户端puppet调用fast探测出主机的一些变量,如主机名、内存大小、IP地址等。Puppet把这些信息使用SSL连接发送给服务器端
② 服务器端的puppetmaster通过fast工具分析检测客户端的主机名,然后找到项目的主配置文件manifest里面对应的node配置,并对该部分内容进行解析,fast发送过来的信息可以作为变量处理,node牵扯到的代码才被解析,没牵扯到的不解析,解析分为语法检查,如果语法没错,继续解析,解析结果生成一个结果‘伪代码’,然后把‘伪代码’发给客户端
③客户端收到‘伪代码’并且执行,客户端把执行结果发给服务器
④服务器端把客户端的执行结果写入日志
针对本实验设计的拓扑图:
四、puppet的类和模块
(1)类的定义
类就是命名的代码块,存放着一个或者多个资源 ;可以继承
类的命名方式
class class_name {
...puppet code...
}
子类的命名方式
class parent_name::subclass_name inherits parent_name {
}
多级继承的子类
class grand_name::parent_name::subclass_name inherits grand_name::parent_name {
}
=> 在子类中覆盖父类中的资源
+> 在子类中为父类的资源新增属性
声明类(3种方式)
include
require
class { 'class_name':
params1 =>value1,
params2 =>value2,
}
(2)关于类的举例
①redis模块:
redis ---------------父类
redis程序包 ------父类定义的资源1
redis服务 -------父类定义的资源2
redis::master ---------子类1
file -------子类1定义的资源
redis::slave -------子类2
file --------子类2定义的资源
## 五、puppet模板
①语法:
<%= Ruby Expression %>替换为表达式的值,
<%= @processorcount %>
<% ruby code %>仅执行代码,不做任何替换;常用于条件判断或循环语句、设定变量以及在输出之前对数据进行处理;
调用模板变量:变量完全限定名称
迭代和条件判断
使用模板生成文件时,使用的文件属性为content
content => template('module_name/template_file_name')
②步骤:
查看puppet的模块目录路径:
puppet agent --configprint modulepath
![](https://s1.51cto.com/images/blog/201712/21/bc57f8d9c46cedcfeea49eb73134c4d4.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
创建必要的目录
创建redis父类
创建子类master
拷贝redis配置文件放到files目录下并修改为redis-master.conf
创建子类slave
拷贝redis配置文件放到files目录下并修改为redis-slave.conf
调用父类:
puppet apply -d -v -e 'include redis'
调用子类:
puppet apply -d -v -e 'include redis::master'
六、实现master/agent框架
(1)前提条件:
①各主机之间能互相解析(由于就几个主机,可以直接使用hosts文件,如果过多建议使用DNS服务器)
标准的主机名命名方式为:
角色名-运营商-机房名-机器IP.域名
例如:web-CNC-ShangHai-1.1.1.1.jungege.com
②各个节点要做到时间同步;
使用ntpdate或者chrony都可以
(2)①在master主机上安装puppet、puppet-server
yum install puppet puppet-server -y
②查看master初始化
命令:puppet master -v --no-daemonize
查看过后可以Ctrl+c退出
③启动服务
命令:systemctl start puppetmaster.service
④agent主机上安装puppet安装包。
yum install puppet -y
⑤启动agent端上的puppet服务
命令:puppet agent --server 主机名 -v --no-daemonize
为了每次启动都要写主机名,可以把主机名写到配置文件里
⑥master给agent签发证书
puppet cert list 【查看待签证书】
puppet cert sign server2.magedu.com 【签证】
⑦在master建立站点清单,
vim /etc/puppet/manifests/site.pp
node 'server1.magedu.com' {
include redis::master
}
sgent会主动向master请求数据
七、puppet kick推送功能的实现
puppet客户端默认每30分钟向服务器申请一次,有的特殊情况需要立刻生效,则需要puppet kick将当前配置推送给客户端,立刻实现目标状态的改变。
①在agent端,编辑puppet配置文件
在【agent】添加 listen = true
②在/etc/puppet/auto.conf添加一下几行
③kick推送,在服务器段运行kick子命令
puppet help kick 【查看帮助】
puppet kick --host server1.magedu.com