自動化運維之puppet

Puppet工作原理

讓管理員只集中於要管理的目標,而忽視實現的細節。puppet既可以在單機上使用,也可以以C/S結構使用。在大規模使用puppet的情況下,通常使用C/S結構,在這種結構中puppet客戶端只運行puppetclient,Puppet服務端只運行puppetmaster。具體的工作流程如圖所示:
自動化運維之puppet

環境

使用四臺服務器模擬搭建puppet環境,拓撲圖如下所示:
自動化運維之puppet

環境表

自動化運維之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 

實驗成功,僅供參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章