简介
💡puppet是一种采用C/S星状的结构的Linux,Unix平台的集中的配置管理平台系统,puppet拥有自己的语言,可管理配置文件,用户,cron任务,软件包,系统服务等等,puppet把这些系统的实体称之为资源,puppet的设计目标是简介对这些资源的管理以及妥善处理资源间的依赖关系
Puppet工作原

Puppet是一个或者多个maste,众多client,所有的客户端都定期(默认为30分钟)使用用facter工具把客户端的基本配置信息,服务器端通过分析客户端主机名,找到该主机的配置代码,然后编译配置代码,把编译好的配置代码发回客户端,客户端执行完成配置,并且把代码执行情况反馈给puppet服务器端
注释: xmlprc是使用http协议作为传输协议的rpc机制 - 使用xml文本的方式传输命令和数据

客户端puppetd 调用 facter,facter会探测出这台主机的一些变量如主机名,内存大小,IP地址等。然后puppet把这些信息发送到服务端
服务器端的puppetmaster检测到客户端的主机名,然后会到manufest里面对应的node配置,然后对这段内容进行解析,facter送过来的信息可以作为变量进行出来的,node牵涉到的代码才解析,其他的代码不解析,解析分为几个过程: 语法检查,然后会生成一个中间的伪代码,然后再把伪代码发给客户机。
客户端接收到伪代码之后就会执行,客户端再把执行的结果发送给服务器
服务器在吧客户端的执行结果写入日志。
Puppet 安装配置
安装之前转变如下:
> 系统配置: centos7
> 服务端 ip 192.168.192.134 hostname 192-168-192-134-jfedu.net
> 客户端 ip 192.168.192.136 hostname 192-168-192-136-jfedu.net
> 配置hostname`hostname 192-168-192-136-jfedu.net`
> 在服务端和客户端编辑hosts `vi /etc/hosts` 在里面追加
192.168.192.134 192-168-192-134-jfedu.net
192.168.192.136 192-168-192-136-jfedu.net
如果服务器比较多采用DNS也是可以的 只有能解析到主机名就可以 主机名对应的ip
Pupet 服务器端安装
首先在服务器端和客户端配置好hostname,因为puppet是基于hostname来检查的,同时都要修改hosts文件
如果有DNS可以不用添加,这里是为了做实验添加:
192.168.192.134 192-168-192-134-jfedu.net
192.168.192.136 192-168-192-136-jfedu.net
Puppet 需要Ruby的支持,如果要查看命令行帮助的话需要额外ruby-rdoc这个软件包
服务端和客户端都需要安装
rpm -Uvh http://yum.puppetlabs.com/puppet-release-el-7.noarch.rpm
安装成功:
获取http://yum.puppetlabs.com/puppet-release-el-7.noarch.rpm
警告:/var/tmp/rpm-tmp.AY5lV7: 头V4 RSA/SHA256 Signature, 密钥 ID 9e61ef26: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:puppet-release-1.0.0-24.el7 ################################# [100%]
服务端需要安装: puppet-server
yum install puppet-server -y
客户端需要安装 puppet
yum install puppet -y
由于puppet客户端与服务器端是通过SSL隧道通信的,客户端安装完成后,需要向服务器申请证书
客户端申请证书的命令
首先必须要保证客户端和服务端时间要保持一直
客户端启动 puppetmaster `/ect/init.d/puppetmaster restart`
puppet agent --server 192-168-192-134-jfedu.net --test
服务器端颁发证书命令
puppet cert -s 192-168-192-136-jfedu.net
puppet cert -list # 查看到申请证书的客户端主机名
puppet cert -s # 可以为特点的主机颁发证书
and -a # 给所有的主机颁发证书
Puppet案例配置
puppet是基于C/S架构的。服务器端保持着所有对客户端服务器的配置代码,在puppet里面叫manifest,客户端下载manifest之后,可以根据manifest对服务器进行配置,列如软件包管理,用户管理,和文件管理等等。
默认的服务器端manifest目录在 /etc/puppet/manifest/下,只需要在该目录下创建一个site.pp的文件,然后写入相应的配置,客户端跟服务器同步的时候会检查该文件,然后做相关同步,
Puppet第一个案例
在服务器端写入代码:
在所有的客户端的/tmp 目录下创建名为test.txt的文件
内容为: hello test !
服务端site.pp内容代码如下: vi /etc/Puppet/manifest/site.pp
node default{
file {
"/tmp/test.txt": content = > "hello test !";
}
}
node "192-168-192-136-jfedu.net" {
file {
"/tmp/test.txt": content = > "hello test !";
}
}
在客户端执行同步命令
puppet agent --server==192-168-192-134-jfedu.net --test
执行改命令的效果puppet生效的话,会在一个/tmp生成一个text.txt文件,内容为hello test !
Puppet资源案例
puppet常用的资源主要如下:
file: 主要负责管理文件
vi /etc/puppet/fileserver.conf 文件, 添加如三行
[files]
path /etc/puppet/files
allow *
在 /etc/puppet/files 文件夹内放入文件 比如放了一个nginx安装脚步nginx_install.sh
node default {
file {
"/root/nginx_install.sh": # 推送到客户端那个目录下
source=> "puppet://192-168-192-134-jfedu.net/files/nginx_install.sh", # 原位置
group => root,
owner => root,
mode => "755"
}
}
然后cp所需要的脚步到/etc/puppet/files目录,没有这个目录则新建
解析: 该资源主要用于从源端同步文件到客户端,把/etc/puppet/file/nginx_install.sh这个脚本推送到客户端的/root/下
###### package: 软件包的安装管理
node default {
package {
["screen","net"]: ensure => "installed";
"wget": ensure => "absent";
}
}
解析: yum install screen 和 net服务,并且卸载weg安装包 installed 一键安装 absent 卸载
###### service: 系统服务的管理
node default {
service {
"sshd": ensure => running;
"nfs": ensure => stopped;
}
}
解析: 定义启动 sshd服务,停止nfs服务
###### cron: 配置自动任务计划
node default {
cron{
"2023 ntpdate":
command => "/usr/sbin/ntpdate pool.ntp.org >> /tmp/ntp.log 2 > &1",
user = > root,
hour => '6-12/2' ,
minute = > '*/5',
}
}
解析: 在客户端写入一个计划任务: 0 0 * * * /usr/sbin/ntpdate pool.net.org 自动同步时间
###### exec: 远程执行运行命令
node default {
exec {
"/root/nginx_install.sh":
cwd => "/root",
user => root,
path => ["/usr/bin","usr/sbin","bin","/bin/sh"],
}
}
############################
# 当文件发生变化的时候才会执行
exec {
"Nginx update to exec":
path => ["/usr/bin","/usr/sbin","/bin","/sbin"],
command => "/bin/sh /root/nginx_install.sh",
subscribe => File["/root/nginx_install.sh"],
refreshonly => true
}
解析: 该资源用于远程执行脚本或者命令
1. File资源管理
node default{
file {
"/tmp/test.txt": content = > "hello test !";
}
}
node "192-168-192-136-jfedu.net" {
file {
"/tmp/test.txt": content = > "hello test !";
}
}
#### Puppet日常管理与配置
###### puppet 自动认证
首先我们先来看一个问题,新服务器可以通过kickstart自动安装完,并且自动安装完puppet相关的包 安装完活客户端会请求证书,然后服务器会给客户端发证书,如果手动颁发很麻烦,如下配置可以让服务器自动验证,前端是配置好hosts或者内部DNS系统
master 192-168-0-130.jfedu.net
Client 192-168-0-131.jfedu.net
在服务器端的puooet.conf配置文件里面[main]下方加入autosign=true 重启puppetmaster服务即可
vi /etc/puppet/puppet.conf 重启 /etc/init.d/puppetmaster restart客户端执行puppet --server=192.168.0.130.jfedu.net --test 服务端自动认证 即服务器不必再去分发证书
###### 重新生产证书
很多时候由于更换主机名,我们需要重新分配认证,在客户端删除
rm -rf /var/lib/puppet/ssl/文件夹,然后在服务器端删除客户端的证书:
puppetca --clean 192-168-0-131.jfedu.net
最后在客户端执行puppetd --server=192-168-0-130.jfedu.net --test 重新申请证书即可
###### 客户端自动同步
在客户端安装完puppet后,并且认证完成后,我们可以看到效果,那怎么让它自动与服务端同步呢,这时候我们需要配置客户端:
在客户端配置puppet相关参数和同步时间: vi /etc/sysconfig/puppet
PUPPET_SERVER=192-168-0-130.jfedu.net 服务器mater的host
PUPPET_PORT=8140 范围服务器的8140端口
PUPPET_LOG=/var/log/puppet/puppet.log 本地日志
PUPPET_EXTRA_ORTS=--waitforcert=500
然后启动/etc/init.d/puppet restart 即可
默认配置完成后,客户端会半小时跟服务器同步一次,我们可以修改时间
vi /etc/puppet/puppet.cinf的[agent]下加入: runinterval = 60 // 代表60秒跟服务器同步一次,修改完后重启puppet过一分钟即可看到客户端同步效果
###### 服务器主动推送
当我们配置完成 puppet服务器和客户端后,客户端会默认半个小时跟服务器同步,如果我们需要更新重要文件,得立即生效 在服务器端使用 puppetrun 这个命令可以给客户端发送一段信号,告诉客户端立刻跟服务器同步,这样就达成我们的目的看
修改客户端puppet的配置文件 vi /etc/puppet/puppet.com 在[agent]后面添加
listen = true // 这个可以让puppet,监听8139端口