Puppet 工作原理
让管理员只集中于要管理的目标, 而忽视实现的细节. puppet 既可以在单机上使用, 也可以以 C/S 结构使用. 在大规模使用 puppet 的情况下, 通常使用 C/S 结构, 在这种结构中 puppet 客户端只运行 puppetclient,Puppet 服务端只运行 puppetmaster. 具体的工作流程如图所示:
环境
使用四台服务器模拟搭建 puppet 环境, 拓扑图如下所示:
环境表
实验步骤
1. 搭建 Puppet Master
(1) 规划三台服务器主机名
- [root@localhost ~]# vim /etc/hostname
- master.test.cn
- [root@localhost ~]# vim /etc/hosts
- 192.168.126.138 master.test.cn
- 192.168.126.148 client01.test.cn
- 192.168.126.158 client02.test.cn
(2) 服务器时间同步
由于 puppet 需要使用 SSL 证书, 依赖时间同步, 所以需要搭建 NTP 服务器
1) 搭建 NTP Server
- [root@localhost ~]# yum install ntp -y
- [root@localhost ~]# vim /etc/ntp.conf
添加以下两行:
- server 127.127.1.0 #指定本地作为时间源服务器
- fudge 127.127.1.0 stratum 8
其作用是当 /etc/ntp.conf 中定义的 server 都不可用时, 将使用 local 时间作为 NTP 服务提供给 NTP 客户端.
2) 启动 ntp 服务并设置开机自启动
- [root@localhost ~]# systemctl stop firewalld.service
- [root@localhost ~]# systemctl disable firewalld.service
- [root@localhost ~]# setenforce 0
- [root@localhost ~]# systemctl start ntpd.service
- [root@localhost ~]# systemctl enable ntpd.service
- [root@localhost ~]# ntpstat #同步
- synchronised to NTP server (193.228.143.13) at stratum 3
- time correct to within 517 ms
- polling server every 64 s
3)puppetmaster 作为 NTP 客户端的配置
- [root@master ~]# yum install ntpdate -y
- [root@master ~]# ntpdate 192.168.126.159
- 6 Aug 09:45:03 ntpdate[3488]: adjust time server 192.168.126.159 offset -0.072288 sec #调整时间服务器 192.168.126.159 偏移 - 0.072288 秒
4) 配置 YUM 源
- [root@master ~]# yum install epel-release -y
- [root@master ~]# yum install puppet-server -y #安装 puppet 服务端
5) 启动 puppet 主程序
- [root@master ~]# systemctl stop firewalld.service
- [root@master ~]# systemctl disable firewalld.service
- [root@master ~]# setenforce 0
- [root@master ~]# systemctl start puppetmaster.service
- [root@master ~]# systemctl enable puppetmaster.service
2. 搭建 puppetclient(两台客户端配置一样)
1) 通过域名 ping 通 puppetmaster
- [root@client01 ~]# ping master.test.cn
- PING master.test.cn (192.168.126.138) 56(84) bytes of data.
- 64 bytes from master.test.cn (192.168.126.138): icmp_seq=1 ttl=64 time=1.06 ms
- 64 bytes from master.test.cn (192.168.126.138): icmp_seq=2 ttl=64 time=3.27 ms
- 64 bytes from master.test.cn (192.168.126.138): icmp_seq=3 ttl=64 time=0.382 ms
- 64 bytes from master.test.cn (192.168.126.138): icmp_seq=4 ttl=64 time=0.660 ms
2) 服务器时间同步
- [root@client01 ~]# yum install ntpdate -y
- [root@client01 ~]# vim /etc/ntp.conf
- server 127.127.1.0 #指定本地作为时间源服务器
- fudge 127.127.1.0 stratum 8
- [root@client01 ~]# ntpdate 192.168.126.159
- 6 Aug 10:01:12 ntpdate[3303]: adjust time server 192.168.126.159 offset -0.012348 sec
3) 配置 YUM 源
- [root@client01 ~]# yum install epel-release -y
- [root@client01 ~]# yum install puppet -y #安装 puppet 客户端
4) 修改 puppet 的配置文件 / etc/puppet/puppet.conf
- [root@client01 ~]# vim /etc/puppet/puppet.conf
- [main]
- # The Puppet log directory.
- # The default value is '$vardir/log'.
- logdir = /var/log/puppet
- # Where Puppet PID files are kept.
- # The default value is '$vardir/run'.
- rundir = /var/run/puppet
- # Where SSL certificates are kept.
- # The default value is '$confdir/ssl'.
- ssldir = $vardir/ssl
- server = master.test.cn #添加 puppet master 的地址
5) 分别在 puppetclient01 和 puppetclient01 上进行注册
- [root@client01 ~]# puppet agent --server=master.test.cn --no-daemonize --verbose
- Info: Creating a new SSL key for client01.test.cn
- Info: Caching certificate for ca
- Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
- Info: Creating a new SSL certificate request for client01.test.cn
- Info: Certificate Request fingerprint (SHA256): C1:1F:11:32:53:96:AA:91:16:9F:CE:F2:AD:D2:3F:56:C7:9B:D9:87:5C:F8:2D:30:7D:FE:49:66:46:2A:D9:FC
- Info: Caching certificate for ca
6) 查看申请注册的客户端
- [root@master ~]# puppet cert --list
- "client01.test.cn" (SHA256) C1:1F:11:32:53:96:AA:91:16:9F:CE:F2:AD:D2:3F:56:C7:9B:D9:87:5C:F8:2D:30:7D:FE:49:66:46:2A:D9:FC
- "client02.test.cn" (SHA256) 7C:C9:22:59:B2:1E:2B:F5:12:30:4D:88:D9:B1:AF:60:FE:02:65:7A:A2:3F:E3:B5:CB:1D:2F:9F:B5:4B:FD:6D
7) 对未注册的客户端进行注册
- [root@master ~]# puppet cert sign --all
- Notice: Signed certificate request for client01.test.cn
- Notice: Removing file Puppet::SSL::CertificateRequest client01.test.cn at '/var/lib/puppet/ssl/ca/requests/client01.test.cn.pem'
- Notice: Signed certificate request for client02.test.cn
- Notice: Removing file Puppet::SSL::CertificateRequest client02.test.cn at '/var/lib/puppet/ssl/ca/requests/client02.test.cn.pem'
8) 查看已经注册的客户端
[root@master ~]# ll /var/lib/puppet/ssl/ca/signed/
总用量 12
-rw-r--r--. 1 puppet puppet 1952 8 月 6 21:22 client01.test.cn.pem
-rw-r--r--. 1 puppet puppet 1952 8 月 6 21:22 client02.test.cn.pem
-rw-r--r--. 1 puppet puppet 2021 8 月 6 21:06 master.test.cn.pem
此时客户端已经完成证书的请求与签名.
配置实例
这里为了保护 Linux 的 ssh 端口, 修改客户端 client1 的 sshd 端口, 将端口 22 修改为 9922, 并实 现重启工作.
首先创建 ssh 模块, ssh 模块下面有三个文件: manifests,templates 和 files.
在 manifests 里面包含一个 init.pp 文件, 这是该模块的初始入口文件, 导入模块时, 会从 init.pp 开始执行. 可以把所有的代码都写到 init.pp 里面, 也可以分成多个 pp 文件, init 再去包含其他文件. 定义 class 类名的时候必须是 ssh, 这样才能实现调用.
file 目录是该模块的文件发布目录, Puppet 提供一个文件分发机制, 类似于 rsync 的模块.
templates 目录包含 erb 模型文件, 这个和 file 资源的 template 属性相关, 不过很少用. 具体配置如下:
1) 创建必要的目录:
- [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/ #修改权限
2) 查看 / etc/puppet/modules/ssh 目录下的结构
[root@master puppet]# ll modules/ssh/
总用量 0
drwxr-xr-x. 3 puppet root 17 8 月 6 21:32 files
drwxr-xr-x. 2 puppet root 6 8 月 6 21:31 manifests
drwxr-xr-x. 2 puppet root 6 8 月 6 21:31 templates
3) 创建模块配置文件 install.pp
[root@master puppet]# vim /etc/puppet/modules/ssh/manifests/install.pp
输入以下信息 (首先确定客户端已安装 ssh 服务):
- class ssh::install{
- package{"openssh":
- ensure=>present,
- }
- }
4) 创建模块配置文件 config.pp
- [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/config.pp
- 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"], #调用 install.pp 确认 ssh 已经安装
- notify=>Class["ssh::service"], #如果 config.pp 发生变化, 通知 service.pp
- }
- }
5) 创建模块配置文件 service.pp
- [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/service.pp
- 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"] #确认 config.pp 调用
- }
- }
6) 创建模块主配置文件 init.pp
- [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/init.pp
- class ssh {
- include ssh::install,ssh::config,ssh::service #将配置文件加载到 ssh 类中去
- }
7) 此时 / etc/puppet/modeles/ssh/mainfests 目录下有四个文件
[root@master puppet]# ll /etc/puppet/modules/ssh/manifests/
总用量 16
-rw-r--r--. 1 root root 248 8 月 6 21:40 config.pp
-rw-r--r--. 1 root root 60 8 月 6 21:46 init.pp
-rw-r--r--. 1 root root 64 8 月 6 21:38 install.pp
-rw-r--r--. 1 root root 165 8 月 6 21:42 service.pp
8) 建立服务端 ssh 统一维护文件
由于服务端和客户端的 sshs_config 文件默认一样, 此时将服务端的 / etc/ssh/sshd_config 复制到模块默认路径中去.
- [root@master puppet]# cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/
- [root@master puppet]# chown -R puppet /etc/puppet/modules/ssh/files/ssh/ #修改权限
9) 创建测试节点配置文件, 并将 ssh 加载进去.
- [root@master puppet]# vim /etc/puppet/manifests/nodes/ssh.pp
- node 'client01.test.cn'{
- include ssh
- }
- node 'client02.test.cn'{
- include ssh
- }
10) 将测试节点载入 puppet, 即修改 site.pp.
- [root@master puppet]# vim /etc/puppet/manifests/site.pp
- import "nodes/ssh.pp"
11) 修改服务器维护的 sshd_config 配置文件
- [root@master puppet]# vim /etc/puppet/modules/ssh/files/ssh/sshd_config
- Port 22 #修改为 9922
12) 重启 puppet 服务
[root@master puppet]# systemctl restart puppetmaster.service
2. 客户端主动拉取
一般在小规模自动化集群中, 如代码上线需要重启服务时, 为了防止出现网站暂时性无法访问的问题, 每台客户端运行一次 puppet agent -t 命令, 选择模式根据客户端集群规模的大小. 根据经验, 一般 puppet 服务器到各客户端会建立 ssh 信任, 然后自定义 shell 脚本, ssh 批量让客户端执行 puppet 同步命令.
1)Client01 端:
- [root@client01 ~]# puppet agent -t
- .....// 省略
- Notice: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]/content:
- --- /etc/ssh/sshd_config 2017-08-07 10:28:25.000000000 +0800
- +++ /tmp/puppet-file20180806-5162-jc80yr 2018-08-06 22:25:58.726506429 +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 ::
- .....// 省略
Client02 端:
- ....// 省略
- Notice: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]/content:
- --- /etc/ssh/sshd_config 2017-08-07 10:28:25.000000000 +0800
- +++ /tmp/puppet-file20180806-4667-149tj11 2018-08-06 22:27:39.362282788 +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 ::
- ......// 省略
2) 此时命令在客户端执行成功, 验证如下:
- [root@client01 ~]# cat /etc/ssh/sshd_config | grep Port
- Port 9922
- #GatewayPorts no
3) 查看服务器 ssh 服务是否重启, 端口是否生效.
- [root@client01 ~]# netstat -tunlp | grep ssh
- tcp 0 0 0.0.0.0:9922 0.0.0.0:* LISTEN 5428/sshd
- tcp6 0 0 :::9922 :::* LISTEN 5428/sshd
3. 服务器推送同步
1) 当大规模部署时, 采用服务器推送模式.
- client:
- [root@client02 ~]# vim /etc/puppet/puppet.conf
最后一行添加
listen = true #使 puppet 监听 8139 端口
2) 验证配置文件 auth.conf 定义了一些验证信息及访问权限
[root@client02 ~]# vim /etc/puppet/auth.conf
最后一行添加
allow * #允许任何服务端推送
3) 启动 puppet 客户端
- [root@client02 ~]# systemctl start puppetagent.service
- [root@client02 ~]# cat /etc/ssh/sshd_config #查看
- ......// 省略
- Port 9922
- #AddressFamily any
- #ListenAddress 0.0.0.0
- #ListenAddress ::
- ......// 省略
4) 开始往客户端推送
- Master:
- [root@master puppet]# puppet kick client02.test.cn
- Triggering client02.test.cn
- Getting status
- status is success
- client02.test.cn finished with exit code 0
- Finished
5) 校验结果如下
- [root@master puppet]# cat /etc/ssh/sshd_config | grep Port
- #Port 22
- #GatewayPorts no
6) 查看服务器 ssh 服务是否重启, 端口是否生效.
- [root@client02 ~]# netstat -tunlp | grep ssh
- tcp 0 0 0.0.0.0:9922 0.0.0.0:* LISTEN 4908/sshd
- tcp6 0 0 :::9922 :::* LISTEN 4908/sshd
实验成功, 仅供参考.
来源: http://blog.51cto.com/13642258/2155525