1. 程式人生 > 其它 >Puppet 的部署與應用,看這一篇就夠了

Puppet 的部署與應用,看這一篇就夠了

Puppet 的部署與應用,看這一篇就夠了

2018-11-20 08:40:572942收藏7

工作原理

Puppet的目的是讓管理員只集中於要管理的目標,而忽略實現的細節。Puppet既可以在單機上使用,也可以c/s使用,在大規模使用puppet的情況下,通常使用c/s結構,在這種結構中puppet客戶端只執行puppetclient,puppet伺服器只執行puppetmaster。

工作流程

1)客戶端puppet呼叫facter(facter是通過ssl加密收集及檢測分析客戶端配置資訊的一個工具),facter探測出主機的一些變數,如主機名,記憶體大小,ip地址等。Puppet把這些資訊通過ssl連線傳送到伺服器器端

2)伺服器端的puppetmaster通過facter工具分析檢測客戶端的主機名,然後找到專案主配置檔案mainfest裡面對應的node配置,並對該部分內容進行解析。Facter傳送過來的資訊可以作為變數處理,node牽扯到的程式碼才解析,其他沒牽涉的程式碼不解析,解析分為幾個階段,首先進行語法檢查,如果語法沒錯,就繼續解析,解析的結果生成一箇中間的“虛擬碼”,然後把虛擬碼傳送給客戶端。
3)客戶端接收到虛擬碼,並執行,客戶端把執行的結果傳送給伺服器。
4)伺服器把客戶端的執行結果寫入日誌。

Puppet工作過程有以下兩點值得注意:
1)為了保證安全,client和master之間是基於ssl和證書的,只有經master證書認證的client可以與master通訊。
2)Puppet會讓系統保持在人們所期望的某種狀態並一直維持下去,例如:檢測某個檔案並保證其一直存在,保證ssh服務始終開啟,如果檔案被刪除了或者ssh服務被關閉了,puppet下次執行時(預設30分鐘),會重新建立該檔案或者啟動ssh服務。

  • 安裝puppet的實驗步驟

  • 搭建puppetmaster

  • 搭建puppetclient

  • 配置測試節點

  • 客戶端主動拉取

  • 伺服器推送

搭建 puppetmaster

規劃伺服器主機名(小規模可以修改/etc/hosts檔案,伺服器多的時候我們需要搭建dns伺服器來實現服務通過主機名進行通訊,這裡就以/etc/hosts檔案來實現)

(puppetmaster)


[root@master /]# vim /etc/sysconfig/network HOSTNAME=master.itzhushou.cn . [root@master /]# vim /etc/hosts 192.168.1.10 master.itzhushou.cn 192.168.1.20 client1.itzhushou.cn 192.168.1.30 client2.itzhushou.cn


重啟生效 [root@master /]# reboot

(NTP)


[root@master /]# rpm -q ntp [root@master /]# vim /etc/ntp.conf (新增以下兩行) server 127.127.1.0 fudge 127.127.1.0 stratum 8

啟動ntp服務並開啟iptables例外


[root@master /]# service ntpd start [root@master /]# chkconfig ntpd on [root@master /]# iptables -I INPUT -p udp --dport 123 -j ACCEPT [root@master /]# service iptables save

(puppetmaster)


[root@master /]# hostname

在puppetmaster上面配置時間同步,作為ntp的客戶端


[root@master /]# ntpdate 192.168.1.40 [root@master /]# mount /dev/cdrom /media/ [root@master /]# cd /media/ [root@master /]# ls

安裝ruby(puppet就是基於ruby語言開發的,所以需要安裝ruby)


[root@master /]# yum -y install compat-readline5 [root@master /]# yum -y install ruby

安裝完成之後檢查版本


[root@master /]# ruby -v [root@master /]#useradd -s /sbin/nologin puppet [root@master /]# cd /

安裝facter(通過facter工具分析檢測客戶端傳來的資訊)


[root@master /]# umount /dev/cdrom /media/ [root@master /]# umount /dev/cdrom [root@master /]# mount /dev/cdrom /media/ [root@master /]# cd /media/ [root@master /]# ls [root@master /]# tar zxf facter-1.7.1.tar.gz -C /usr/ [root@master /]# cd /usr/facter-1.7.1/ [root@master /]# ruby install.rb

安裝puppet

編譯安裝:


[root@master /]# cd /media/ [root@master /]# tar zxf puppet-2.7.21.tar.gz -C /usr/ [root@master /]# cd /usr/puppet-2.7.21/ [root@master /]# ruby install.rb

複製配置檔案


[root@master /]# cp conf/redhat/fileserver.conf /etc/puppet/ [root@master /]# cp conf/redhat/puppet.conf /etc/puppet/ [root@master /]# cp conf/redhat/server.init /etc/init.d/puppetmaster

修改檔案屬性並建立puppet主目錄:


[root@master /]# chmod +x /etc/init.d/puppetmaster [root@master /]# mkdir /etc/puppet/manifets [root@master /]# mkdir /etc/puppet/manifests [root@master /]# mkdir /etc/puppet/modules

puppet服務證書請求與簽名
關閉防火牆(也可開例外)


Service iptables stop [root@master /]# service iptables stop

在[main]標題下新增一行:配置伺服器模組路徑


[root@master /]# vim /etc/puppet/puppet.conf modulepath = /etc/puppet/modules:/usr/share/puppet/modules

啟動puppet主程式


[root@master /]# service puppetmaster start [root@master /]# netstat -anpt | grep ruby

配置防火牆


[root@master /]# iptables -I INPUT -p tcp --dport 8140 -j ACCEPT [root@master /]# service iptables save

(puppetclient1)
搭建puppetclient
規劃伺服器主機名


[root@master /]# vim /etc/sysconfig/network HOSTNAME=client1.itzhushou.cn


[root@master /]# vim /etc/hosts 192.168.1.10 master.itzhushou.cn 192.168.1.20 client1.itzhushou.cn 192.168.1.30 client2.itzhushou.cn . [root@master /]# reboot [root@master /]# hostname


伺服器時間同步 [root@master /]# ntpdate 192.168.1.40

安裝ruby


[root@master /]# mount /dev/cdrom /media/ [root@master /]# yum -y install compact-readline5 reby 或者rpm -ivh compact-readline5......

安裝facter


[root@master /]# cd / [root@master /]# umount /dev/cdrom /media/ [root@master /]# mount /dev/cdrom /media [root@master /]# cd /media/ [root@master /]# tar zxf facter-1.7.1.tar.gz -C /usr/ [root@master /]# cd /usr/facter-1.7.1/ [root@master /]# ruby install.rb

安裝puppet


[root@master /]# cd /media/ [root@master /]# tar zxf puppet-2.7.21.tar.gz -C /usr/ [root@master /]# cd /usr/puppet-2.7.21/ [root@master /]# ruby install.rb

複製檔案並設定執行許可權


[root@master /]# cp conf/redhat/puppet.conf /etc/puppet/ [root@master /]# cp conf/redhat/client.init /etc/init.d/puppetclient [root@master /]# chmod +x /etc/init.d/puppetclient [root@master /]# service iptables stop

puppet服務證書請求籤名


[root@master /]# vim /etc/puppet/puppet.conf server = /master.itzhushou.cn

注意:puppetclient2的配置過程與puppetclient1類似,主機名改為client2.itzhushou.cn即可,其他都一樣。

註冊伺服器


分別在puppetclient1和puppetclient2上進行註冊,執行的命令一樣 [root@master /]# puppet agent --server=master.itzhushou.cn --no-daemonize --verbose

上面會一直等待,可以按ctrl+c結束,但是伺服器上已經有申請資訊了

(puppetmaster)
可以執行puppet cert —list 檢視申請註冊客戶端
將未註冊的客戶端進行註冊Puppet cert sign —all


[root@master /]# puppet cert --list [root@master /]# puppet cert sign --all

可以通過目錄去檢視已經註冊的客戶端(看到下面的資訊說明註冊成功了)
[root@master /]# ll /var/lib/puppet/ssl/ca/signed/

應用案例

1、配置一個測試節點
節點資訊:/etc/puppet/manifests/nodes
模組資訊: /etc/pupppet/modules

實驗目標:為了保護linux的ssh端×××破,批量修改客戶端的sshd埠,將22號埠改為9922,並實現重啟sshd服務的工作。

想完成以上幾點,需要明確幾點:

  1. 需確定openssh軟體包安裝

  2. 需確定存在ssh的配置檔案

  3. 確定sshd的服務是系統服務

建立ssh模組,模組的目錄為ssh,模組下有三個檔案分別是:manifests、templates、files。

manifest裡面必須包含一個init.pp檔案,這是該模組的的初始(入口)檔案,匯入一個模組的時候需要從init.pp開始執行,可以把所有的程式碼都寫入到這個檔案中,也可以分成多個.pp檔案,init在去包含其他檔案,定義class類名時必須是ssh,這樣才能實現調動
files目錄是該模組的釋出目錄,puppet提供了一個檔案分割機制,類似rsync的模組。

templates目錄包含erb模組檔案、這個和file資源的templates屬性有關(很少使用)
master端


[root@master /]# rpm -q openssh

建立必要的目錄


[root@master /]# mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files} [root@master /]# mkdir /etc/puppet/manifests/nodes [root@master /]# mkdir /etc/puppet/modules/ssh/files/ssh [root@master /]# chown -R puppet /etc/puppet/modules/ [root@master /]# ll /etc/puppet/modules/ssh/

建立模組配置檔案install.pp
Vi /etc/puppet/modules/ssh/manifests/install.pp
輸入以下資訊(首先確定客戶端安裝了ssh服務)


[root@master /]# vim /etc/puppet/modules/ssh/manifests/install.pp class ssh::install{ package{ "openssh": ensure => present, } }

注意:present是以,結尾,由於配置的是ssh服務,所以模組名為ssh,如果配置http,則模組名為http。

建立模組配置檔案config.php


[root@master /]# 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”],
notify => Class[“ssh::service”],
}
}


**命令解釋** 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"], //呼叫ssh::install確定 openssh已經安裝 notify => Class["ssh::service"], //如果config.pp發生變化通知service.pp } } >這個檔案的內容主要是定義,釋出的配置檔案許可權以及呼叫ssh::install檢查client是否安裝了ssh服務,以及呼叫ssh::service重新啟動sshd服務。 建立模組配置檔案service.pp

[root@master /]# vim /etc/puppet/modules/ssh/manifests/service.pp

class ssh::service {
service {“sshd”:
ensure=>running,
hasstatus=>true,
hasrestart=>true,
enable=>true,
require=>Class[“ssh::config”]
}
}


**命令解釋** class ssh::service{ service{ "sshd": ensure =>running, //確定sshd執行 hasstatus=>true, //puppet該服務支援status命令,即類似service sshd status命令 hasrestart=>true, //puppet該服務支援status命令,即類似service sshd status命令 enable=>true, //服務是否開機啟動 require=>Class["ssh::config"] //確認config.pp呼叫 } } 建立模組主配置檔案init.pp

[root@master /]# vim /etc/puppet/modules/ssh/manifests/init.pp

class ssh{
include ssh::install,ssh::config,ssh::service
}


上面一共建立了4個檔案,確保建立好 `[root@master /]# ll /etc/puppet/modules/ssh/manifests/` 建立伺服器端ssh統一維護檔案 由於伺服器端和客戶端的sshd_config檔案預設一樣,此時將伺服器端/etc/ssh/sshd_config複製到模組預設路徑。 [root@master /]# cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/ [root@master /]# chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config

[root@master /]# vim /etc/puppet/manifests/nodes/ssh.pp

node ‘client1.itzhushou.cn’ {
include ssh
}

node ‘client2.itzhushou.cn’ {
include ssh
}


將測試節點載入puppet,即修改site.pp Vi /etc/puppet/manifests/site.pp,輸入以下資訊:

[root@master /]# vim /etc/puppet/manifests/site.pp

import “nodes/ssh.pp”


修改伺服器端維護的sshd_config配置檔案

[root@master /]# vim /etc/puppet/modules/ssh/files/ssh/sshd_config
Port 9922

重新啟動puppet
[root@master /]# /etc/init.d/puppetmaster restart


(puppetclient1) 配置客戶端主動拉取 一般在小規模自動化群集中,如程式碼上線需要重新啟動服務時,為了防止網站暫時性無法訪問的問題,每臺客戶端需要執行一次puppet agent -t命令,所以選擇模式時需要根據規模的大小來決定,一般運維工程師puppet伺服器到各客戶端建立ssh信任,然後自定義指令碼,ssh讓客戶端批量執行puppet命令同步。 在客戶端puppetclient1上執行命令: `[root@master /]# puppet agent -t` ![](http://i2.51cto.com/images/blog/201803/07/ee28e070defb4e3a3c2a22df15f19c38.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 然後在客戶端上檢視ssh配置檔案的埠是否改變,並檢視埠執行狀態:

[root@master /]# vim /et/ssh/sshd_config
[root@master /]# netstat -anpt | grep ssh


![](http://i2.51cto.com/images/blog/201803/07/308907289f912669bb3576c8b45180fc.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 伺服器推送同步 1修改puppet主配置檔案 在客戶端上執行下面命令: Vi /etc/puppet/puppet.conf,在最後新增一行,使puppet監聽8139埠

[root@master /]# vim /etc/puppet/puppet.conf
listen= true


修改puppet驗證配置檔案,定義許可權 在客戶端上執行:vim /etc/puppet/auth.conf 在最後一行新增下面的內容

[root@master /]# vim /etc/puppet/puppet.conf
listen= true


修改puppet驗證配置檔案,定義許可權 在客戶端上執行:`vim /etc/puppet/auth.conf` 在最後一行新增下面的內容

[root@master /]# vim /etc/puppet/auth.conf
allow *
.
啟動puppet客戶端
[root@master /]# /etc/init.d/puppetclient start
```

(puppetmaster)

再次把伺服器的ssh配置檔案埠改為9933(換一個試試)

伺服器推送給客戶端
[root@master /]# puppet kick client1.itzhushou.cn

在客戶端檢視埠是否改變

來源:

http://blog.51cto.com/13555423/2083745?from=singlemessage