本文共 9989 字,大约阅读时间需要 33 分钟。
让管理员只集中于要管理的目标,而忽视实现的细节。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/hosts192.168.126.138 master.test.cn192.168.126.148 client01.test.cn192.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.cnPING 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 ms64 bytes from master.test.cn (192.168.126.138): icmp_seq=2 ttl=64 time=3.27 ms64 bytes from master.test.cn (192.168.126.138): icmp_seq=3 ttl=64 time=0.382 ms64 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 --verboseInfo: Creating a new SSL key for client01.test.cnInfo: Caching certificate for caInfo: csr_attributes file loading from /etc/puppet/csr_attributes.yamlInfo: Creating a new SSL certificate request for client01.test.cnInfo: 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:FCInfo: 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 --allNotice: Signed certificate request for client01.test.cnNotice: 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.cnNotice: 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
此时客户端已经完成证书的请求与签名。
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/总用量 0drwxr-xr-x. 3 puppet root 17 8月 6 21:32 filesdrwxr-xr-x. 2 puppet root 6 8月 6 21:31 manifestsdrwxr-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.ppclass 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.ppclass ssh::service{service { "sshd":ensure=>running, #确认ssh运行hasstatus=>true, #puppet该服务支持status命令,类似于service sshd statushasrestart=>true, #puppet该服务支持restart,类似于service sshd restartenable=>true, #服务器是否开机启动require=>Class["ssh::config"] #确认config.pp调用}}
6)创建模块主配置文件init.pp
[root@master puppet]# vim /etc/puppet/modules/ssh/manifests/init.ppclass 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.ppnode 'client01.test.cn'{include ssh}node 'client02.test.cn'{include ssh}
10)将测试节点载入puppet,即修改site.pp。
[root@master puppet]# vim /etc/puppet/manifests/site.ppimport "nodes/ssh.pp"
11)修改服务器维护的sshd_config配置文件
[root@master puppet]# vim /etc/puppet/modules/ssh/files/ssh/sshd_configPort 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 PortPort 9922#GatewayPorts no
3)查看服务器ssh服务是否重启,端口是否生效。
[root@client01 ~]# netstat -tunlp | grep sshtcp 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.cnTriggering client02.test.cnGetting statusstatus is successclient02.test.cn finished with exit code 0Finished
5)校验结果如下
[root@master puppet]# cat /etc/ssh/sshd_config | grep Port#Port 22#GatewayPorts no
6)查看服务器ssh服务是否重启,端口是否生效。
[root@client02 ~]# netstat -tunlp | grep sshtcp 0 0 0.0.0.0:9922 0.0.0.0:* LISTEN 4908/sshd tcp6 0 0 :::9922 :::* LISTEN 4908/sshd
实验成功,仅供参考。
转载于:https://blog.51cto.com/13642258/2155525