Puppet 搭建與部署,看這一篇就夠了
Puppet工作原理
讓管理員只集中于要管理的目標(biāo),而忽視實現(xiàn)的細(xì)節(jié)。puppet既可以在單機上使用,也可以以C/S結(jié)構(gòu)使用。在大規(guī)模使用puppet的情況下,通常使用C/S結(jié)構(gòu),在這種結(jié)構(gòu)中puppet客戶端只運行puppetclient,Puppet服務(wù)端只運行puppetmaster。具體的工作流程如圖所示:
環(huán)境
使用四臺服務(wù)器模擬搭建puppet環(huán)境,拓?fù)鋱D如下所示:
環(huán)境表
實驗步驟
1.搭建Puppet Master
(1)規(guī)劃三臺服務(wù)器主機名
- [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)服務(wù)器時間同步
由于puppet需要使用SSL證書,依賴時間同步,所以需要搭建NTP服務(wù)器
1)搭建NTP Server
- [root@localhost ~]# yum install ntp -y
 - [root@localhost ~]# vim /etc/ntp.conf
 - 添加以下兩行:server 127.127.1.0 #指定本地作為時間源服務(wù)器
 - fudge 127.127.1.0 stratum 8
 
其作用是當(dāng) /etc/ntp.conf 中定義的server都不可用時,將使用local時間作為NTP服務(wù)提供給NTP客戶端。
2)啟動ntp服務(wù)并設(shè)置開機自啟動
- [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 #調(diào)整時間服務(wù)器192.168.126.159偏移-0.072288秒
 
4)配置YUM源
- [root@master ~]# yum install epel-release -y
 - [root@master ~]# yum install puppet-server -y #安裝puppet服務(wù)端
 
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)服務(wù)器時間同步
- [root@client01 ~]# yum install ntpdate -y
 - [root@client01 ~]# vim /etc/ntp.conf
 - server 127.127.1.0 #指定本地作為時間源服務(wù)器
 - 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上進(jìn)行注冊
- [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:7
 
7)對未注冊的客戶端進(jìn)行注冊
- [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)查看已經(jīng)注冊的客戶端
- [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
 
此時客戶端已經(jīng)完成證書的請求與簽名。
配置實例
- 這里為了保護(hù)Linux的ssh端口,修改客戶端client1的sshd端口,將端口22修改為9922,并實 現(xiàn)重啟工作。
 - 首先創(chuàng)建ssh模塊,ssh模塊下面有三個文件:manifests,templates和files。
 - 在manifests里面包含一個init.pp文件,這是該模塊的初始入口文件,導(dǎo)入模塊時,會從init.pp開始執(zhí)行??梢园阉械拇a都寫到init.pp里面,也可以分成多個pp文件,init再去包含其他文件。定義class類名的時候必須是ssh,這樣才能實現(xiàn)調(diào)用。
 - file目錄是該模塊的文件發(fā)布目錄,Puppet提供一個文件分發(fā)機制,類似于rsync的模塊。
 - templates目錄包含erb模型文件,這個和file資源的template屬性相關(guān),不過很少用。具體配置如下:
 
1)創(chuàng)建必要的目錄:
- [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/ #修改權(quán)限
 
2)查看/etc/puppet/modules/ssh目錄下的結(jié)構(gòu)
- [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)創(chuàng)建模塊配置文件install.pp
- [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/install.pp
 - 輸入以下信息(首先確定客戶端已安裝ssh服務(wù)):class ssh::install{
 - package{"openssh":
 - ensure=>present,
 - }
 - }
 
4)創(chuàng)建模塊配置文件config.pp
- [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/config.pp
 - class ssh::config{
 - file {"/etc/ssh/sshd_config": #配置客戶端需要同步的文件
 - ensure=>present, #確認(rèn)客戶端中有此文件
 - owner=>"root", #文件屬主
 - group=>"root", #文件屬組
 - mode=>"0600", #文件權(quán)限屬性
 - source=>"puppet://$puppetserver/modules/ssh/ssh/sshd_config",
 - #從服務(wù)端同步文件
 - require=>Class["ssh::install"], #調(diào)用install.pp確認(rèn)ssh已經(jīng)安裝
 - notify=>Class["ssh::service"], #如果config.pp發(fā)生變化,通知service.pp
 - }
 - }
 
5)創(chuàng)建模塊配置文件service.pp
- [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/service.pp
 - class ssh::service{
 - service { "sshd":
 - ensure=>running, #確認(rèn)ssh運行
 - hasstatus=>true, #puppet該服務(wù)支持status命令,類似于service sshd status
 - hasrestart=>true, #puppet該服務(wù)支持restart,類似于service sshd restart
 - enable=>true, #服務(wù)器是否開機啟動
 - require=>Class["ssh::config"] #確認(rèn)config.pp調(diào)用
 - }
 - }
 
6)創(chuàng)建模塊主配置文件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)建立服務(wù)端ssh統(tǒng)一維護(hù)文件
由于服務(wù)端和客戶端的sshs_config文件默認(rèn)一樣,此時將服務(wù)端的/etc/ssh/sshd_config復(fù)制到模塊默認(rèn)路徑中去。
- [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/ #修改權(quán)限
 
9)創(chuàng)建測試節(jié)點配置文件,并將ssh加載進(jìn)去。
- [root@master puppet]# vim /etc/puppet/manifests/nodes/ssh.pp
 - node 'client01.test.cn'{
 - include ssh
 - }
 - node 'client02.test.cn'{
 - include ssh
 - }
 
10)將測試節(jié)點載入puppet,即修改site.pp。
- [root@master puppet]# vim /etc/puppet/manifests/site.pp
 - import "nodes/ssh.pp"
 
11)修改服務(wù)器維護(hù)的sshd_config配置文件
- [root@master puppet]# vim /etc/puppet/modules/ssh/files/ssh/sshd_config
 - Port 22 #修改為9922
 
12)重啟puppet服務(wù)
- [root@master puppet]# systemctl restart puppetmaster.service
 
2.客戶端主動拉取
一般在小規(guī)模自動化集群中,如代碼上線需要重啟服務(wù)時,為了防止出現(xiàn)網(wǎng)站暫時性無法訪問的問題,每臺客戶端運行一次puppet agent -t命令,選擇模式根據(jù)客戶端集群規(guī)模的大小。根據(jù)經(jīng)驗,一般puppet服務(wù)器到各客戶端會建立ssh信任,然后自定義shell腳本,ssh批量讓客戶端執(zhí)行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)此時命令在客戶端執(zhí)行成功,驗證如下:
- [root@client01 ~]# cat /etc/ssh/sshd_config | grep Port
 - Port 9922
 - #GatewayPorts no
 
3)查看服務(wù)器ssh服務(wù)是否重啟,端口是否生效。
- [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.服務(wù)器推送同步
1)當(dāng)大規(guī)模部署時,采用服務(wù)器推送模式。
- client:
 - [root@client02 ~]# vim /etc/puppet/puppet.conf
 - 最后一行添加
 - listen = true #使puppet監(jiān)聽8139端口
 
2)驗證配置文件auth.conf定義了一些驗證信息及訪問權(quán)限
- [root@client02 ~]# vim /etc/puppet/auth.conf
 - 最后一行添加
 - allow * #允許任何服務(wù)端推送
 
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)校驗結(jié)果如下
- [root@master puppet]# cat /etc/ssh/sshd_config | grep Port
 - #Port 22
 - #GatewayPorts no
 
6)查看服務(wù)器ssh服務(wù)是否重啟,端口是否生效。
- [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
 
實驗成功,僅供參考。


















 
 
 










 
 
 
 