说明:由于头条篇幅有限,分上下两部分内容呈现给大家,你现在看到的是上半部分
技能目标:
· 熟悉Puppet工作原理
· 能够进行Puppet部署与应用
4.1 案例一分析
4.1.1 案例概述
作为一名系统管理员,维护服务器正常运行是最基本的职责。在管理几台到几十台服务器时,大部分管理员喜欢写自己的小工具来维护。但是随着服务器数量的增多,任务量也逐渐增加,这时就需要简洁的、强大的框架来完成系统管理任务。
为实现这一目的,引入一批工具。这批工具是"可编程"的,系统管理员只需要为这批工具写上几行"代码",它便会自动完成所有的工作, Puppet就是这批运维自动化工具中的其中一种。在一些大型互联网企业中,Puppet运维自动化工具管理着几百甚至上千台服务器,它可以针对多台服务器进行统一操作,如部署统一软件、进行统一上线维护等,而且能够快速完成上线部署,减少人力并降低人力误操作风险。
4.1.2 案例前置知识点
1.Puppet工作原理
Puppet的目的是让管理员只集中于要管理的目标,而忽略实现的细节。Puppet既可以在单机上使用,也可以以C/S结构使用。在大规模使用Puppet的情况下,通常使用C/S结构。在这种结构中Puppet客户端只运行Puppet Client,Puppet服务器端只运行Puppet Master。
Puppet管理工具的工作流程如图4.1所示。
图4.1
(1)客户端Puppet调用Facter工具(Facter是通过SSL加密收集及检测分析客户端配置信息的一个工具),Facter探测出主机的一些变量,如主机名、内存大小、IP地址等。Puppet把这些信息通过SSL连接发送到服务器端。
(2)服务器端的Puppet Master 通过Facter工具分析检测客户端的主机名,然后找到项目主配置文件manifest里面对应的node配置, 并对该部分内容进行解析。Facter发送过来的信息可以作为变量处理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,首先进行语法检查,如果语法没错,就继续解析。解析的结果生成一个中间的"伪代码",然后把伪代码发给客户端。
(3)客户端接收到"伪代码"并且执行,客户端把执行结果发送给服务器。
(4)服务器端把客户端的执行结果写入日志。
2.Puppet工作中的注意事项
Puppet工作过程中有以下两点值得注意。
(1)为了保证安全,Client和Master之间是基于SSL和证书的,只有经Master证书认证的Client才能与Master通信。
(2)Puppet会让系统保持在人们所期望的某种状态并一直维持下去。例如检测某个文件并保证其一直存在,保证SSH服务始终开启,如果文件被删除了或者SSH服务被关闭了,Puppet下次执行时(默认30分钟),会重新创建该文件或者启动SSH服务。
4.1.3 案例环境
1. 本案例实验环境
本案例主要演示批量管理客户端SSH服务,案例实验中使用的四台服务器均采用Cen系统版本且图形化安装,要求能上互联网,Selinux和防火墙均已关闭。拓扑图如下4.2所示:
图4.2
服务器具体信息如表4-1所示。
表4-1
2. 案例需求
使用Puppet批量修改客户端SSH服务端口。
3. 案例实现思路
(1)环境准备工作;
(2)安装Puppet Master和Puppet Client;
(3)配置测试节点;
(4)客户端主动拉取和服务端主动推送。
4.2 案例一实施
4.2.1 Puppet 安装与部署
1. 规划服务器主机名
在小规模Puppet环境下,一般是修改/etc/hosts文件实现服务通过主机名进行通信,然而上千台服务器,需要搭建自己的DNS服务器来实现服务通过主机名进行通信。此实验我们通过修改/etc/hosts文件来实现。
[root@node1 ~]# hostnamectl set-hostname ma
[root@node1 ~]# bash
[root@master ~]# hostname
ma
另外三台服务器上分别修改主机名。
[root@node2 ~]# hostnamectl set-hostname clien
[root@node3 ~]# hostnamectl set-hostname clien
[root@node4 ~]# hostnamectl set-hostname n
在四台服务器的/etc/hosts文件中都添加以下几行地址解析记录。
vim /etc/hosts
192.168.9.233 ma
192.168.9.234 clien
192.168.9.235 clien
192.168.9.236 n
2. 搭建时间服务器
由于Puppet使用的SSL证书,依赖时间同步,所以需要搭建NTP服务器。
1)搭建NTP Server
[root@ntp ~]# yum install -y ntp
[root@ntp ~]# vim /etc \\添加以下两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8
上述配置的作用是当/etc中定义的server都不可用时,将使用local时间作为NTP服务提供给NTP客户端。修改完/etc文件后即可启动NTP服务。
[root@ntp ~]# systemctl start ntpd
[root@ntp ~]# systemctl enable ntpd //加入开机启动
Created symlink from /etc/systemd/system to /usr/lib/systemd/system.
[root@ntp ~]# ntpstat //查看时间同步状态
synchronised to local net at stratum 9
time correct to within 7949 ms
polling server every 64 s
2)节点同步时间
其余三台主机都要执行时间同步操作,下面仅以在ma主机为例进行演示。
[root@master ~]# ntpdate n
13 Jun 17:36:49 ntpdate[4761]: step time server 192.168.9.236 offset -9.317174 sec
3. 安装Puppet Master
从官网下载Puppet源,上传到ma服务器上。
1)安装puppetlabs源
[root@master ~]# rpm -ivh
警告:: 头V4 RSA/SHA1 Signature, 密钥 ID 4bd6ec30: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:puppetlabs-release-7-12 ################################# [100%]
2)安装并启动Puppet服务端
[root@master ~]# yum install -y puppet-server
[root@master ~]# systemctl start puppetmaster
[root@master ~]# systemctl enable puppetmaster
Created symlink from /etc/systemd/system to /usr/lib/systemd/system.
4. 安装Puppet Client
两台客户端安装并配置Puppet,下面仅以clien为例进行操作演示。从官网下载Puppet源,上传到两台客户端服务器上。
1)安装puppetlabs源
[root@client01 ~]# rpm -ivh
警告:: 头V4 RSA/SHA1 Signature, 密钥 ID 4bd6ec30: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:puppetlabs-release-7-12 ################################# [100%]
2)客户端安装Puppet
[root@client01 ~]# yum install -y puppet
3)修改客户端配置文件
在/etc/puppe文件中的[main]标题下添加"server = ma"配置字段用于设置Puppet Master的域名。
[root@client01 ~]# vim /etc/puppe
server = ma
5. 注册
1))客户端申请注册
在两台客户端上申请注册,下面只是在clien上做演示。
[root@client01 ~]# puppet agent --server=ma --no-daemonize --verbose
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppe
Info: Creating a new SSL certificate request for clien
Info: Certificate Request fingerprint (SHA256): 87:BC:82:A5:5E:92:2F:F8:D6:51:1F:05:E5:A4:EE:62:FB:72:91:24:96:5D:28:C9:BD:9B:BF:72:EC:E0:C1:81
Info: Caching certificate for ca
等待一会儿可以按Ctrl+C结束,从服务器端查看到申请信息。
[root@master ~]# puppet cert --list //在master端查看申请注册的客户端
"clien" (SHA256) 87:BC:82:A5:5E:92:2F:F8:D6:51:1F:05:E5:A4:EE:62:FB:72:91:24:96:5D:28:C9:BD:9B:BF:72:EC:E0:C1:81
"clien" (SHA256) 68:3D:C2:12:6D:D2:5E:45:51:C6:96:95:27:04:4F:16:9B:6C:FC:B9:BC:2A:23:D3:41:96:CA:4C:11:53:86:2C
2)完成注册
在Master上将所有申请未注册的客户端进行注册。
[root@master ~]# puppet cert sign --all
Notice: Signed certificate request for clien
Notice: Removing file Puppet::SSL::CertificateRequest clien at '/var/lib/puppet/ssl/ca/requests/clien.pem'
Notice: Signed certificate request for clien
Notice: Removing file Puppet::SSL::CertificateRequest clien at '/var/lib/puppet/ssl/ca/requests/clien.pem'
注册成功后,可以通过目录去查看已经注册的客户端。
[root@master ~]# ll /var/lib/puppet/ssl/ca/signed/
总用量 12
-rw-r--r-- 1 puppet puppet 1960 6月 14 11:27 clien.pem
-rw-r--r-- 1 puppet puppet 1960 6月 14 11:27 clien.pem
-rw-r--r-- 1 puppet puppet 2037 6月 13 17:58 ma.pem
此时客户端已经完成证书的请求与签名。
4.2.2 配置实例
为了保护Linux的SSH端口,批量修改客户端SSH端口,将默认端口22修改为9922,并实现重启工作。在Master端创建SSH模块,模块目录为ssh,模块下面有三个文件:manifests、templates和files。
· manifests里面必须要包含一个init.pp的文件,这是该模块的初始(入口)文件,导入一个模块的时候,会从init.pp开始执行。可以把所有的代码都写到init.pp里面,也可以分成多个pp文件,init再去包含其他文件,定义class类名的时候必须是ssh,这样才能实现调用。
· files目录是该模块的文件发布目录,Puppet提供一个文件分发机制,类似rsync的模块。
· templates目录包含erb模型文件,这个和file资源的template属性有关(很少用)。
1. 配置测试节点
Master需要使用的相关配置文件如下:
· 节点信息:/etc/puppet/manifests/nodes/。
· 模块信息:/etc/puppet/modules/。
1)Master上创建需要的目录
[root@master ~]# cd /etc/puppet/
[root@master puppet]# mkdir -p modules/ssh/{manifests,templates,files}
[root@master puppet]# mkdir manifests/nodes
[root@master puppet]# mkdir modules/ssh/files/ssh
[root@master puppet]# chown -R puppet modules/ //修改权限
[root@master puppet]# ll modules/ssh //查看/etc/puppet/modules/ssh目录下的结构
总用量 0
drwxr-xr-x 3 puppet root 17 6月 14 11:53 files
drwxr-xr-x 2 puppet root 6 6月 14 11:53 manifests
drwxr-xr-x 2 puppet root 6 6月 14 11:53 templates
2)创建模块配置文件in
[root@master ~]# vim /etc/puppet/modules/ssh/manifests/in
//输入以下信息(首先确定客户端安装SSH服务)
class ssh::install{
package{ "openssh":
ensure => present,
}
}
3)创建模块配置文件con
[root@master ~]# vim /etc/puppet/modules/ssh/manifests/con
//输入以下信息配置需要同步的文件
class ssh::config{
file { "/etc/ssh/sshd_config": //配置客户端需要同步的文件
ensure => present, //确定客户端此文件存在
owner =>"root", //文件所属用户
group =>"root", //文件所属组
mode =>"0600", //文件属性
source =>"puppet://$puppetserver/modules/ssh/ssh/sshd_config",
//从服务器端同步文件
require => Class["ssh::install"],
//调用in确定ssh已经安装
notify => Class["ssh::service"],
//如果con发生变化通知
}
}
4)创建模块配置文件
[root@master ~]# vim /etc/puppet/modules/ssh/manifests/
class ssh::service {
service {"sshd":
ensure=>running, //确定ssh运行
hasstatus=>true, // Puppet该服务支持status命令,即类似service sshd status
hasrestart=>true, // Puppet该服务支持restart命令,即类似service sshd restart
enable=>true, //服务器是否开机启动
require=>Class["ssh::config"] //确认con调用
}
}
5)创建模块主配置文件init.pp
[root@master ~]# vim /etc/puppet/modules/ssh/manife
class ssh{
include ssh::install,ssh::config,ssh::service //加载以上配置文件
}
此时/etc/puppet/modules/ssh/manifests目录下有四个文件。
[root@master ~]# ll /etc/puppet/modules/ssh/manifests/
总用量 16
-rw-r--r-- 1 root root 395 6月 14 13:39 con
-rw-r--r-- 1 root root 67 6月 14 13:46 init.pp
-rw-r--r-- 1 root root 85 6月 14 13:34 in
-rw-r--r-- 1 root root 256 6月 14 13:44
6)建立服务器端ssh统一维护文件
复制服务器端/etc/ssh/sshd_config文件到模块默认路径。
[root@master ~]# cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/
[root@master ~]# chown -R puppet /etc/puppet/modules/ssh/files/ssh/
7)创建测试节点配置文件,并加载SSH。
[root@master ~]# vim /etc/puppet/manifests/node
node 'clien'{
include ssh
}
node 'clien'{
include ssh
}
8)将测试节点载入Puppet,即修改
[root@master ~]# vim /etc/puppet/manifests/
import "node"
9)修改服务端维护的sshd_config配置文件
[root@master ~]# vim /etc/puppet/modules/ssh/files/ssh/sshd_config
Port 9922 //取消注释并修改为9922
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
10)重新启动Puppet Master服务
[root@master ~]# systemctl restart puppetmaster
2. 客户端主动拉取
在其中一台clien客户端上执行以下操作从服务器端主动拉取配置。
[root@client01 ~]# puppet agent -t
//省略部分
+++ /tmp/puppet-file20180614-20702-1bca8ub 2018-06-14 14:31:18.773477995 +0800
@@ -14,7 +14,7 @@
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
-#Port 22
+Port 9922
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
Info: Computing checksum on file /etc/ssh/sshd_config
Info: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]: Filebucketed /etc/ssh/sshd_config to puppet with sum 0440a9608de01c4fa1c1dd6301b568ec
Notice: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]/content: content changed '{md5}0440a9608de01c4fa1c1dd6301b568ec' to '{md5}1a16baba38eb0a7e8a9e971f8a9f0845'
Info: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]: Scheduling refresh of Class[Ssh::Service]
Info: Class[Ssh::Service]: Scheduling refresh of Service[sshd]
Notice: /Stage[main]/Ssh::Service/Service[sshd]: Triggered 'refresh' from 1 events
Info: Creating state file /var/lib/puppet/state
Notice: Finished catalog run in 0.52 seconds
[root@client01 ~]# cat /etc/ssh/sshd_config | grep Port
Port 9922
#GatewayPorts no
查看服务器SSH服务是否重启,端口是否生效。
[root@client01 ~]# netstat -tunlp | grep ssh
tcp 0 0 0.0.0.0:9922 0.0.0.0:* LISTEN 20919/sshd
tcp6 0 0 :::9922 :::* LISTEN 20919/sshd
3. 服务端主动推送
当大规模部署时不可能在每台客户端都采用拉取动作,而此时用服务器推送模式反而更合理。我们在客户端clien上做修改。
1)修改puppet配置文件,最后一行添加如下。
[root@client02 ~]# vim /etc/puppe
listen = true //使Puppet监听8139端口
2)修改验证配置文件au定义一些验证信息及访问权限,最后一行添加如下。
allow * //允许任何服务端推送
3)启动Puppet Agent客户端
[root@client02 ~]# systemctl start puppetagent
4)修改客户端clien的/etc/ssh/sshd_config文件,将Port 9922还原成最初始状态,然后重启sshd服务。查看还原后的/etc/ssh/sshd_config的内容如下。
[root@client02 ~]# cat /etc/ssh/sshd_config | grep Port
#Port 22
#GatewayPorts no
[root@client02 ~]# netstat -tunlp| grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 17794/sshd
tcp6 0 0 :::22 :::* LISTEN 17794/sshd
5)向clien节点推送配置
[root@master ~]# puppet kick clien
Triggering clien
Getting status
status is success
clien finished with exit code 0
Finished
6)校验结果
此时在clien客户端可以查看到SSH端口已经被更改为9922。
[root@client02 ~]# cat /etc/ssh/sshd_config | grep Port
Port 9922
#GatewayPorts no
[root@client02 ~]# netstat -tunlp | grep sshd
tcp 0 0 0.0.0.0:9922 0.0.0.0:* LISTEN 18090/sshd
tcp6 0 0 :::9922 :::* LISTEN 18090/sshd
4.3 案例二分析
4.3.1 案例概述
如果有工作经验的朋友看到部署,第一时间会想到是将新的应用替换或者覆盖旧的应用,然后重启服务之类的。没错,这里的自动部署就是将新的应用自动覆盖旧的应用,起到一个更新的作用,主要还是利用文件拷贝的原理。
网上可能大部分自动部署的案例是将SVN和Puppet Master整合在一台服务器上。如果SVN服务器里面的代码有更新,Puppet Agent就会根据自身设置拉取更新文件的时间完成全自动部署。这样做唯一的缺点就是如果出现问题不是能很好的控制,例如由于开发人员误操作导致一个错误的文件已提交到SVN服务器上,那么Agent节点也会更新成错误的文件,而Web站点将会出现故障。所以将SVN服务器、Puppet Master服务器、发布服务器建议全部单独分开,只要保证发布服务器上的代码不会更新错误的文件,Web站点也就不会自动更新。因此,就不能用Puppet Master作为文件服务器,而是以发布服务器作为文件服务器,所以需要用到Puppet的rsync模块。
4.3.2 案例前置知识点
自动部署工作流程图如下4.3所示。
图4.3
· 开发人员手工提交更新代码到SVN服务器上。
· 开发人员使用系统账号登录到发布服务器上,手工执行与发版相对应的项目脚本。也就是从SVN服务器上检出要更新的代码到发布机上。
· 待脚本执行完后,Web测试环境的应用会根据自身设置的时间自动更新或者更新后执行一些其它动作。这里暂定五分钟。
· 开发人员和测试人员进行相关测试。
· 如果测试环境通过测试,需要发布正式环境的话,请开发人员邮件或者电话通知运维人员要发版的项目。
· 同样运维人员也是手工执行与发版相对应的项目脚本(正式环境发布脚本),发布完成后五分钟左右通知开发人员发布结束。
4.3.3 案例环境
1. 本案例实验环境
本案例主要演示版本自动部署,这里使用五台服务器,五台服务器均采用Cen系统版本且图形化安装,要求能上互联网,Selinux和防火墙均已关闭。服务器具体信息如表4-2所示。
表4-2
确保发布服务器到另外四台服务器网络都是相通的。同时确保所有服务器的时间都同步。本案例的自动部署网络环境比较适合于公司内部机房有一条SDH专线连到IDC机房,而不是通过互联网去部署,因为这样都相当于在局域网内执行动作,速度和安全性都是有可靠的。SVN服务器、发布服务器、Puppet Master都在公司内部,Web正式节点和Web测试节点都在IDC机房中。所以说自动部署也在很大程度上依赖网络环境。
2. 案例需求
使用Puppet进行项目版本发布。
3. 案例实现思路
(1)准备工作;
(2)安装Puppet软件;
(3)安装配置SVN服务器;
(4)配置Puppet服务端和客户端;
(5)Puppet部署发布服务器;
(6)发布测试和正式应用。
4.4 案例二实施
1. 准备工作
1)添加域名解析
需要修改Puppet Master、发布服务器、Web正式节点、Web测试节点、SVN服务器的hosts文件,因为Puppet都是基于域名的方式来管理节点。如果IDC机房内部有DNS管理更好,因为以后更多的项目都会自动部署。以ma主机为例,五台服务器都增加如下解析:
[root@master ~]# vim /etc/hosts
192.168.9.233 ma
192.168.9.234 web.
192.168.9.235 web-test.
192.168.9.236 n release.
192.168.9.200 svn.
2) 同步时间,
五台服务器都需要进行时间同步操作,下面以Master为例进行演示。
[root@master ~]# ntpdate n
14 Jun 16:02:59 ntpdate[19748]: adjust time server 192.168.9.236 offset 0.001015 sec
2. 安装Puppet
在Puppet Master、发布服务器、Web正式节点和Web测试节点都需要安装Puppet源。Puppet Master需要安装puppet-server包,而发布服务器、Web正式节点和Web测试节点都被看作是Puppet的被管理节点,也就是通常所说的Agent端。
[root@master ~]# rpm -ivh
[root@master ~]# yum install -y puppet-server
[root@master ~]# systemctl start puppetmaster
[root@master ~]# systemctl enable puppetmaster
[root@master ~]# netstat -antpu |grep 8140
tcp 0 0 0.0.0.0:8140 0.0.0.0:* LISTEN 18686/ruby
Web正式节点和Web测试节点在场景一中都已经安装了Puppet,下面只是演示在发布机上进行安装Puppet。进行安装Puppet操作之前,需要提前上传下载好的puppetlabs源的rpm包。
[root@release ~]# rpm -ivh
[root@release ~]# yum install -y puppet
3. 安装配置SVN服务器
1) 在svn.服务器上安装SVN服务
[root@svn ~]# yum install -y subversion
2) 创建目录
[root@svn ~]# mkdir -p /var/svn/html
3)创建版本库
[root@svn ~]# svnadmin create /var/svn/html/
4)查看生成文件
[root@svn ~]# ls /var/svn/html/
conf db format hooks locks README.txt
5)修改svn配置文件
[root@svn ~]# vim /var/svn/html/con
anon-access = read //匿名用户可读
auth-access = write //授权用户可写
password-db = /var/svn/html/conf/passwd //指定账号文件
authz-db = /var/svn/html/conf/authz //指定权限文件
6)设置账号密码
[root@svn ~]# vim /var/svn/html/conf/passwd
[users]
alpha = alphapasswd
sysadmin = sysadminpasswd
7)设置权限
[root@svn ~]# vim /var/svn/html/conf/authz
[/]
sysadmin = r
alpha = rw
[web]
sysadmin = r
alpha = rw
8)启动版本库
[root@svn ~]# svnserve -d -r /var/svn/html
9)创建测试目录并测试
[root@svn ~]# cd /var/svn/html/
[root@svn html]# mkdir web
[root@svn html]# svn import web file:///var/svn/html/web -m "init svn"
提交后的版本为 1。
4. 配置Puppet Agent
因为Puppet Master管理客户端Agent是基于SSL方式通过证书通信,所以需要在所有的Agent角色上,也就是在发布服务器、Web正式节点、Web测试节点上修改Puppet的主配置文件/etc/puppe,在[main]字段中指定Puppet服务端地址。因为场景一和场景二中某些主机名已经发生改变,所以都需要重新认证。下面以发布机上为例进行演示。
[root@release ~]# vim /etc/puppe
server = ma // Puppet Master的地址
然后在所有的Agent角色上分别执行如下命令。
[root@release ~]# puppet agent --server=ma --verbose --no-daemonize
在Master进行查看申请注册的客户端。
[root@master ~]# puppet cert --list
"release." (SHA256) 7C:54:CF:19:0F:E8:65:3A:74:D7:0B:AB:5F:27:AA:2E:71:F0:BE:2A:27:8E:EF:6A:AB:66:C2:2B:C0:9A:FC:05
"web-test." (SHA256) 6E:E6:4C:48:99:73:B4:2D:96:38:94:38:0F:B8:EF:F1:35:2B:38:9C:E1:DF:2D:78:D7:BF:FD:DD:DA:6A:CF:BE
"web." (SHA256) DC:46:B3:2B:DB:44:20:B6:D8:F7:BA:EC:16:E5:54:64:D2:C2:1A:AF:EC:70:95:F7:2F:09:35:EC:88:4E:DA:39
在Puppet Master执行如下命令完成注册。
[root@master ~]# puppet cert sign release. //单个客户端
Notice: Signed certificate request for release.
Notice: Removing file Puppet::SSL::CertificateRequest release. at '/var/lib/puppet/ssl/ca/requests/release..pem'
[root@master ~]# puppet cert sign --all //所有客户端
Notice: Signed certificate request for web.
Notice: Removing file Puppet::SSL::CertificateRequest web. at '/var/lib/puppet/ssl/ca/requests/web..pem'
Notice: Signed certificate request for web-test.
Notice: Removing file Puppet::SSL::CertificateRequest web-test. at '/var/lib/puppet/ssl/ca/requests/web-test..pem'
5. 使用Puppet部署发布服务器
1)下载concat和rsync模块
下面开始需要在发布服务器、Puppet Master都下载安装concat和rsync模块。如果发布服务器上不下载模块,一会发布服务器上生成的r文件里面会是空的,Puppet 的rsync 模块在GitHub位置 。这里是使用git,如果服务器没有安装,可以先使用yum -y install git 来安装,如不想安装git也可以下载zip压缩包,解压到相应目录。
在发布服务器、Puppet Master上执行如下命令。
[root@release ~]# yum install -y git
[root@release ~]# cd /etc/puppet/modules/
[root@release modules]# git clone && mv pupmod-concat concat
正克隆到 'pupmod-concat'...
remote: Counting objects: 116, done.
Remote: Total 116 (delta 0), reused 0 (delta 0), pack-reused 116
接收对象中: 100% (116/116), 48.07 KiB | 40.00 KiB/s, done.
处理 delta 中: 100% (26/26), done.
[root@release modules]# git clone && mv pupmod-rsync rsync
正克隆到 'pupmod-rsync'...
remote: Counting objects: 36, done.
Remote: Total 36 (delta 0), reused 0 (delta 0), pack-reused 36
Unpacking objects: 100% (36/36), done.
[root@release modules]# ll
总用量 0
drwxr-xr-x 5 root root 72 6月 14 17:09 concat
drwxr-xr-x 8 root root 118 6月 14 17:10 rsync
2) 配置Puppet Master
Puppet Master开始创建管理Agent节点目录及文件,方便以后管理。
[root@master ~]# mkdir -p /etc/puppet/manifests/nodes
[root@master ~]# vim /etc/puppet/manifests/nodes/release..pp
class rsync::client inherits rsync {
}
node 'release.' {
include 'rsync::server'
rsync::server::global { 'global':
address => '192.168.9.236'
}
rsync::server::section { 'web':
comment => 'This is formal file path',
path => '/var/www/html/web',
hosts_allow => '192.168.9.234'
}
rsync::server::section { 'web_test':
comment => 'This is test file path',
path => '/var/www/html/web_test',
hosts_allow => '192.168.9.235'
}
}
3)创建配置文件
在配置文件中定义 Puppet 相关的变量和默认配置,是Puppet最先读取的文件。
[root@master ~]# vim /etc/puppet/manifests/
import "nodes/release..pp"
4)自动配置发布服务器
[root@release ~]# puppet agent --server=ma --test -v
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for release.
Info: /Stage[main]/Rsync/Tidy[/etc/rsync]: File does not exist
Info: Applying configuration version '1528969467'
Notice: /Stage[main]/Rsync/File[/etc/rsync]/ensure: created
Notice:
//省略部分
Notice: /Stage[main]/Rsync::Server/Service[rsync]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Rsync::Server/Service[rsync]: Unscheduling refresh on Service[rsync]
Notice: Finished catalog run in 8.25 seconds
查看发布服务器的/etc目录,发现已经自动生成r文件,但是rsync服务是未启动的。自动生成的/etc/r文件内容如下。
[root@release ~]# cat /etc/r
pid file = /var/run
syslog facility = daemon
port = 873
address = 192.168.9.236
[web]
comment = This is formal file path
path = /var/www/html/web
use chroot = false
max connections = 0
max verbosity = 1
lock file = /var/run
read only = true
write only = false
list = false
uid = root
gid = root
outgoing chmod = o-w
ignore nonreadable = true
transfer logging = true
log format = "%o %h [%a] %m (%u) %f %l"
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz *.rar *.jar *.pdf *.sar *.war
hosts allow = 192.168.9.234
hosts deny = *
[web_test]
comment = This is test file path
path = /var/www/html/web_test
use chroot = false
max connections = 0
max verbosity = 1
lock file = /var/run
read only = true
write only = false
list = false
uid = root
gid = root
outgoing chmod = o-w
ignore nonreadable = true
transfer logging = true
log format = "%o %h [%a] %m (%u) %f %l"
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz *.rar *.jar *.pdf *.sar *.war
hosts allow = 192.168.9.235
hosts deny = *