讓管理員只集中於要管理的目標,而忽視實現的細節。puppet既能夠在單機上使用,也能夠以C/S結構使用。在大規模使用puppet的狀況下,一般使用C/S結構,在這種結構中puppet客戶端只運行puppetclient,Puppet服務端只運行puppetmaster。具體的工做流程如圖所示:node
使用四臺服務器模擬搭建puppet環境,拓撲圖以下所示:shell
1.搭建Puppet Mastervim
(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服務器ssh
1)搭建NTP Servertcp
[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客戶端。ide
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
此時客戶端已經完成證書的請求與簽名。
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
實驗成功,僅供參考。