防偽碼:忽如一夜春風(fēng)來,千樹萬樹梨花開。
第十二章 puppet部署與應(yīng)用
前言:作為一名運維工程師,就需要尋找一款能夠降低工作量的工具。那么今天就給大家介紹一批工具,這批工具是“可編程”的,只需要為這批工具寫上幾行代碼,它便會自動完成所有的工作,這批工具就是運維自動化puppet(為什么說是一批工具,因為軟件不止一個)。Puppet可以針對多臺服務(wù)器進行統(tǒng)一的操作,例如:軟件分發(fā),統(tǒng)一執(zhí)行腳本,在服務(wù)器上寫好腳本分發(fā)給客戶機,客戶機就會自動執(zhí)行,減少了人力及誤操作風(fēng)險。Puppet與我們之前在windows2008R2中學(xué)習(xí)過的“組策略”非常相似,所以在windows中有的功能,在linux中都能找到這些功能的影子。
2016年的第一場雪,比以往時候來的更晚一些......嘿嘿,開心^_^。
一、 工作原理和案例環(huán)境
1、 工作原理
Puppet的目的是讓管理員只集中于要管理的目標,而忽略實現(xiàn)的細節(jié)。Puppet既可以在單機上使用,也可以c/s使用,在大規(guī)模使用puppet的情況下,通常使用c/s結(jié)構(gòu),在這種結(jié)構(gòu)中puppet客戶端只運行puppetclient,puppet服務(wù)器只運行puppetmaster。
2、 工作流程
1) 客戶端puppet調(diào)用facter(facter是通過ssl加密收集及檢測分析客戶端配置信息的一個工具),facter探測出主機的一些變量,如主機名,內(nèi)存大小,ip地址等。Puppet把這些信息通過ssl連接發(fā)送到服務(wù)器器端
2) 服務(wù)器端的puppetmaster通過facter工具分析檢測客戶端的主機名,然后找到項目主配置文件mainfest里面對應(yīng)的node配置,并對該部分內(nèi)容進行解析。Facter發(fā)送過來的信息可以作為變量處理,node牽扯到的代碼才解析,其他沒牽涉的代碼不解析,解析分為幾個階段,首先進行語法檢查,如果語法沒錯,就繼續(xù)解析,解析的結(jié)果生成一個中間的“偽代碼”,然后把偽代碼發(fā)送給客戶端。
3) 客戶端接收到偽代碼,并執(zhí)行,客戶端把執(zhí)行的結(jié)果發(fā)送給服務(wù)器。
4) 服務(wù)器把客戶端的執(zhí)行結(jié)果寫入日志。
Puppet工作過程有以下兩點值得注意:
1) 為了保證安全,client和master之間是基于ssl和證書的,只有經(jīng)master證書認證的client可以與master通信。
2) Puppet會讓系統(tǒng)保持在人們所期望的某種狀態(tài)并一直維持下去,例如:檢測某個文件并保證其一直存在,保證ssh服務(wù)始終開啟,如果文件被刪除了或者ssh服務(wù)被關(guān)閉了,puppet下次執(zhí)行時(默認30分鐘),會重新創(chuàng)建該文件或者啟動ssh服務(wù)。
3、 案例環(huán)境
二、 安裝puppet的實驗步驟
A、搭建puppetmaster
B、搭建puppetclient
C、配置測試節(jié)點
D、客戶端主動拉取
E、服務(wù)器推送
1、 搭建puppetmaster
1) 規(guī)劃服務(wù)器主機名(小規(guī)模可以修改/etc/hosts文件,服務(wù)器多的時候我們需要搭建dns服務(wù)器來實現(xiàn)服務(wù)通過主機名進行通信,
這里就以/etc/hosts文件來實現(xiàn))
為了讓主機名立即生效,執(zhí)行下面命令(或者重啟服務(wù)器)
2) 搭建NTP服務(wù)器(前面已經(jīng)提到過facter使用證書與puppetmaster驗證身份,所以一定要確保puppetclient與puppetmaster時間保持一致,
需要單獨準備一臺時間服務(wù)器來提供時間同步)
搭建NTP服務(wù)器
yum -y ntp
vim /etc/ntp.conf,添加以下兩行:
啟動ntp服務(wù)并開啟iptables例外
在puppetmaster上面配置時間同步,作為ntp的客戶端
3) 安裝ruby(puppet就是基于ruby語言開發(fā)的,所以需要安裝ruby)
安裝完成之后檢查版本
4) 安裝facter
安裝facter(通過facter工具分析檢測客戶端傳來的信息)
5) 安裝puppet
編譯安裝:
復(fù)制配置文件
修改文件屬性并創(chuàng)建puppet主目錄:
6) puppet服務(wù)證書請求與簽名(生產(chǎn)環(huán)境中iptables默認全是關(guān)閉的)
Service iptables stop
修改配置文件
在[main]標題下添加一行:配置服務(wù)器模塊路徑
啟動puppet主程序,配置防火墻策略
2、 搭建puppetclient
1) 規(guī)劃服務(wù)器主機名
Vi /etc/hosts(添加以下幾行)
2)服務(wù)器時間同步
3) 安裝ruby
4) 安裝facter
5)安裝puppet
6) 復(fù)制文件并設(shè)置執(zhí)行權(quán)限
7) puppet服務(wù)證書請求簽名
Vim /etc/puppet/puppet.conf(增加一行:設(shè)置master服務(wù)器的域名)
注意:puppetclient2的配置過程與puppetclient1類似,只需將主機名改為client2.benet.com即可,此處不再贅述
8) 注冊服務(wù)器
分別在puppetclient1和puppetclient2上進行注冊,執(zhí)行的命令一樣
上面會一直等待,可以按ctrl+c結(jié)束,但是服務(wù)器上已經(jīng)有申請信息了
可以執(zhí)行puppet cert --list 查看申請注冊客戶端
將未注冊的客戶端進行注冊
Puppet cert sign --all
可以通過目錄去查看已經(jīng)注冊的客戶端(看到下面的信息說明注冊成功了)
三、 應(yīng)用案例
1、 配置一個測試節(jié)點
節(jié)點信息:/etc/puppet/manifests/nodes
模塊信息: /etc/pupppet/modules
實驗?zāi)繕耍簽榱吮Wolinux的ssh端口爆破,批量修改客戶端的sshd端口,將22號端口改為9922,并實現(xiàn)重啟sshd服務(wù)的工作。
想完成以上幾點,需要明確幾點:
①需確定openssh軟件包安裝
②需確定存在ssh的配置文件
③確定sshd的服務(wù)是系統(tǒng)服務(wù)
創(chuàng)建ssh模塊,模塊的目錄為ssh,模塊下有三個文件分別是:manifests、templates、files。
manifest里面必須包含一個init.pp文件,這是該模塊的的初始(入口)文件,導(dǎo)入一個模塊的時候需要從init.pp開始執(zhí)行,
可以把所有的代碼都寫入到這個文件中,也可以分成多個.pp文件,init在去包含其他文件,定義class類名時必須是ssh,這樣才能實現(xiàn)調(diào)動
files目錄是該模塊的發(fā)布目錄,puppet提供了一個文件分割機制,類似rsync的模塊。
templates目錄包含erb模塊文件、這個和file資源的templates屬性有關(guān)(很少使用)
master端:
1) 創(chuàng)建必要的目錄
mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files}
mkdir /etc/puppet/manifests/nodes
mkdir /etc/puppet/modules/ssh/files/ssh
chown -R puppet /etc/puppet/modules/
2) 創(chuàng)建模塊配置文件install.pp
Vi /etc/puppet/modules/ssh/manifests/install.pp
輸入以下信息(首先確定客戶端安裝了ssh服務(wù))
注意:presemt是以,結(jié)尾,由于配置的是ssh服務(wù),所以模塊名為ssh,如果配置http,則模塊名為http。
3) 創(chuàng)建模塊配置文件config.php
Vi /etc/puppet/modules/ssh/manifests/config.pp,輸入以下內(nèi)容:
命令詳解:
class ssh::config{
file{ "/etc/ssh/sshd_config": //配置客戶端需要同步的文件
ensure=>present, //確定客戶端此文件存在
owner =>"root", //文件所屬用戶
group=>"root", //文件所屬組
mode=>"0600", //文件權(quán)限
source=> "puppet://$puppetserver/modules/ssh/ssh/sshd_config", //從服務(wù)器同步文件的路徑
require => Class["ssh::install"], //調(diào)用ssh::install確定
openssh已經(jīng)安裝
notify => Class["ssh::service"], //如果config.pp發(fā)生變化通知service.pp
}
}
這個文件的內(nèi)容主要是定義,發(fā)布的配置文件權(quán)限以及調(diào)用ssh::install檢查client是否安裝了ssh服務(wù),以及調(diào)用ssh::service重新啟動sshd服務(wù)。
4) 創(chuàng)建模塊配置文件service.pp
Vi /etc/puppet/modules/ssh/manifests/service.pp
命令詳解:
class ssh::service{
service{ "sshd":
ensure =>running, //確定sshd運行
hasstatus=>true, //puppet該服務(wù)支持status命令,即類似servicesshd status命令
hasrestart=>true //puppet該服務(wù)支持status命令,即類似servicesshd status命令
enable=>true, //服務(wù)是否開機啟動
require=>Class["ssh::config"] //確認config.pp調(diào)用
}
}
5) 創(chuàng)建模塊主配置文件init.pp
Vi /etc/puppet/modules/ssh/manifests/init.pp
上面一共建立了4個文件,確保建立好
6) 建立服務(wù)器端ssh統(tǒng)一維護文件
由于服務(wù)器端和客戶端的sshd_config文件默認一樣,此時將服務(wù)器端/etc/ssh/sshd_config復(fù)制到模塊默認路徑。
7) 創(chuàng)建測試節(jié)點配置文件,并將ssh加載進去
Vi /etc/puppet/manifests/nodes/ssh.pp,輸入以下信息
8) 將測試節(jié)點載入puppet,即修改site.pp
Vi /etc/puppet/manifests/site.pp,輸入以下信息:
9) 修改服務(wù)器端維護的sshd_config配置文件
Vi /etc/puppet/modules/ssh/files/ssh/sshd_config
10) 重新啟動puppet
2、 配置客戶端主動拉取
一般在小規(guī)模自動化群集中,如代碼上線需要重新啟動服務(wù)時,為了防止網(wǎng)站暫時性無法訪問的問題,每臺客戶端需要運行一次puppet agent -t命令,所以選擇模式時需要根據(jù)規(guī)模的大小來決定,一般運維工程師puppet服務(wù)器到各客戶端建立ssh信任,然后自定義腳本,ssh讓客戶端批量執(zhí)行puppet命令同步。
在客戶端puppetclient1上執(zhí)行命令
然后在客戶端上查看ssh配置文件的端口是否改變,并查看端口運行狀態(tài):
Vi /etc/ssh/sshd_config
由上圖可以看出,客戶端的ssh端口已經(jīng)變成9922,而且ssh服務(wù)自動重啟了,說明我們的實驗做對了。但是如果都由客戶端自己拉取的話,可以想象如果有幾百甚至上千臺服務(wù)器呢,客戶端拉取一定是不可取的,所以我們可以采用另一種方式,就是服務(wù)器推送,只需要在服務(wù)器上執(zhí)行一次命令,所有的客戶端都會同步,這樣工作會更輕松一些。
3、 服務(wù)器推送同步
1) 修改puppet主配置文件
在客戶端上執(zhí)行下面命令:
Vi /etc/puppet/puppet.conf,在最后添加一行,使puppet監(jiān)聽8139端口
2) 修改puppet驗證配置文件,定義權(quán)限
在客戶端上執(zhí)行:vim /etc/puppet/auth.conf
在最后一行添加下面的內(nèi)容
3)啟動puppet客戶端
4)再次把服務(wù)器的ssh配置文件端口改為12345(換一個試試)
5)服務(wù)器推送給客戶端
6)在客戶端查看端口是否改變
客戶端ssh端口已經(jīng)改變,實驗正確。但是今天僅僅是做了ssh同步的一個應(yīng)用案例,實際上puppet功能十分強大,應(yīng)用非常靈活,運維的工作基本上它都可以完成自動化,相關(guān)腳本在網(wǎng)上有很多,大家可以查詢練習(xí)。
謝謝觀看,真心的希望能幫到您!
本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!
更多建議: