Puppet部署與應(yīng)用
前言:到目前為止莽鸿,我們已經(jīng)搭建了很多的服務(wù)器,每一臺服務(wù)器都需要執(zhí)行很多的命令拜轨,給我的感覺是實(shí)驗(yàn)不難抽减,原理也好理解,就是命令太麻煩橄碾。如果只管理幾臺服務(wù)器卵沉,命令多點(diǎn)也沒什么颠锉,但是如果管理著成百上千臺服務(wù)器,可以想象一下史汗,工作量將是多么的龐大琼掠。所以作為一名運(yùn)維工程師,就需要尋找一款能夠降低工作量的工具停撞。那么今天就給大家介紹一批工具瓷蛙,這批工具是“可編程”的,只需要為這批工具寫上幾行代碼戈毒,它便會自動完成所有的工作艰猬,這批工具就是運(yùn)維自動化puppet(為什么說是一批工具,因?yàn)檐浖恢挂粋€)埋市。Puppet可以針對多臺服務(wù)器進(jìn)行統(tǒng)一的操作冠桃,例如:軟件分發(fā),統(tǒng)一執(zhí)行腳本道宅,在服務(wù)器上寫好腳本分發(fā)給客戶機(jī)食听,客戶機(jī)就會自動執(zhí)行,減少了人力及誤操作風(fēng)險培己。Puppet與我們之前在windows2008R2中學(xué)習(xí)過的“組策略”非常相似碳蛋,所以在windows中有的功能,在linux中都能找到這些功能的影子省咨。
工作原理和案例環(huán)境
工作原理
Puppet的目的是讓管理員只集中于要管理的目標(biāo)肃弟,而忽略實(shí)現(xiàn)的細(xì)節(jié)。Puppet既可以在單機(jī)上使用零蓉,也可以c/s使用笤受,在大規(guī)模使用puppet的情況下,通常使用c/s結(jié)構(gòu)敌蜂,在這種結(jié)構(gòu)中puppet客戶端只運(yùn)行puppetclient箩兽,puppet服務(wù)器只運(yùn)行puppetmaster。
工作流程
客戶端puppet調(diào)用facter(facter是通過ssl加密收集及檢測分析客戶端配置信息的一個工具)章喉,facter探測出主機(jī)的一些變量汗贫,如主機(jī)名,內(nèi)存大小秸脱,ip地址等落包。Puppet把這些信息通過ssl連接發(fā)送到服務(wù)器器端
服務(wù)器端的puppetmaster通過facter工具分析檢測客戶端的主機(jī)名,然后找到項(xiàng)目主配置文件mainfest里面對應(yīng)的node配置摊唇,并對該部分內(nèi)容進(jìn)行解析咐蝇。Facter發(fā)送過來的信息可以作為變量處理,node牽扯到的代碼才解析巷查,其他沒牽涉的代碼不解析有序,解析分為幾個階段抹腿,首先進(jìn)行語法檢查,如果語法沒錯旭寿,就繼續(xù)解析警绩,解析的結(jié)果生成一個中間的“偽代碼”,然后把偽代碼發(fā)送給客戶端许师。
客戶端接收到偽代碼房蝉,并執(zhí)行,客戶端把執(zhí)行的結(jié)果發(fā)送給服務(wù)器微渠。
服務(wù)器把客戶端的執(zhí)行結(jié)果寫入日志。
Puppet工作過程有以下兩點(diǎn)值得注意:
為了保證安全咧擂,client和master之間是基于ssl和證書的逞盆,只有經(jīng)master證書認(rèn)證的client可以與master通信。
Puppet會讓系統(tǒng)保持在人們所期望的某種狀態(tài)并一直維持下去松申,例如:檢測某個文件并保證其一直存在云芦,保證ssh服務(wù)始終開啟,如果文件被刪除了或者ssh服務(wù)被關(guān)閉了贸桶,puppet下次執(zhí)行時(默認(rèn)30分鐘)舅逸,會重新創(chuàng)建該文件或者啟動ssh服務(wù)。
案例環(huán)境
虛擬機(jī)環(huán)境
安裝puppet的實(shí)驗(yàn)步驟
搭建puppetmaster
搭建puppetclient
配置測試節(jié)點(diǎn)
客戶端主動拉取
服務(wù)器推送
搭建puppetmaster
規(guī)劃服務(wù)器主機(jī)名(小規(guī)幕噬福可以修改/etc/hosts文件琉历,服務(wù)器多的時候我們需要搭建dns服務(wù)器來實(shí)現(xiàn)服務(wù)通過主機(jī)名進(jìn)行通信,這里就以/etc/hosts文件來實(shí)現(xiàn))
Vi ?/etc/sysconfig/network
Vi ?/etc/hosts
為了讓主機(jī)名立即生效水醋,執(zhí)行下面命令(或者重啟服務(wù)器)
搭建NTP服務(wù)器(前面已經(jīng)提到過facter使用證書與puppetmaster驗(yàn)證身份旗笔,所以一定要確保puppetclient與puppetmaster時間保持一致,需要單獨(dú)準(zhǔn)備一臺時間服務(wù)器來提供時間同步)
搭建NTP服務(wù)器
vim /etc/ntp.conf拄踪,添加以下兩行:
啟動ntp服務(wù)并開啟iptables例外
[root@centos5]# iptables -I INPUT -p ?udp --dport 123 -j ACCEP
[root@centos5]# service iptables save
在puppetmaster上面配置時間同步蝇恶,作為ntp的客戶端
安裝ruby(puppet就是基于ruby語言開發(fā)的,所以需要安裝ruby)
安裝完成之后檢查版本
安裝facter
安裝facter(通過facter工具分析檢測客戶端傳來的信息)
安裝puppet
編譯安裝:
復(fù)制配置文件
修改文件屬性并創(chuàng)建puppet主目錄
puppet服務(wù)證書請求與簽名
關(guān)閉防火墻(也可開例外)
Service iptables ?stop
修改配置文件
在[main]標(biāo)題下添加一行:配置服務(wù)器模塊路徑
啟動puppet主程序
[root@master puppet-2.7.21]# netstat -anpt | grep ruby
tcp ???????0 ?????0 0.0.0.0:8140 ???????????????0.0.0.0:* ??????????????????LISTEN ?????2306/ruby
puppetmaster所監(jiān)聽的端口為8140
配置防火墻:
[root@master puppet-2.7.21]# iptables -I INPUT -p tcp --dport 8140 -j ACCEPT
[root@master puppet-2.7.21]# service iptables save
搭建puppetclient
規(guī)劃服務(wù)器主機(jī)名
Vi /etc/sysconfig/network
Vi /etc/hosts(添加以下幾行)
2)服務(wù)器時間同步
安裝ruby
或者rpm -ivh compact-readline5......
安裝facter
5)安裝puppet
復(fù)制文件并設(shè)置執(zhí)行權(quán)限
puppet服務(wù)證書請求簽名
Service iptables stop
Vim /etc/puppet/puppet.conf(增加一行:設(shè)置master服務(wù)器的域名)
注意:puppetclient2的配置過程與puppetclient1類似惶桐,主機(jī)名改為client2.itzhushou.cn即可撮弧,其他都一樣。
注冊服務(wù)器
分別在puppetclient1和puppetclient2上進(jìn)行注冊姚糊,執(zhí)行的命令一樣
上面會一直等待贿衍,可以按ctrl+c結(jié)束,但是服務(wù)器上已經(jīng)有申請信息了
可以執(zhí)行puppet ?certsign ?--list查看申請注冊客戶端
將未注冊的客戶端進(jìn)行注冊
Puppet ?cert ?sign ?--all
可以通過目錄去查看已經(jīng)注冊的客戶端(看到下面的信息說明注冊成功了)
應(yīng)用案例
配置一個測試節(jié)點(diǎn)
節(jié)點(diǎn)信息:/etc/puppet/manifests/nodes
模塊信息:/etc/pupppet/modules
實(shí)驗(yàn)?zāi)繕?biāo):為了保護(hù)linux的ssh端口爆破叛拷,批量修改客戶端的sshd端口舌厨,將22號端口改為9922,并實(shí)現(xiàn)重啟sshd服務(wù)的工作忿薇。
想完成以上幾點(diǎn)裙椭,需要明確幾點(diǎn):
①需確定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迈倍,這樣才能實(shí)現(xiàn)調(diào)動
files目錄是該模塊的發(fā)布目錄伤靠,puppet提供了一個文件分割機(jī)制,類似rsync的模塊啼染。
templates目錄包含erb模塊文件宴合、這個和file資源的templates屬性有關(guān)(很少使用)
master端
創(chuàng)建必要的目錄
創(chuàng)建模塊配置文件install.pp
Vi ?/etc/puppet/modules/ssh/manifests/install.pp
輸入以下信息(首先確定客戶端安裝了ssh服務(wù))
注意:presemt是以,結(jié)尾,由于配置的是ssh服務(wù)迹鹅,所以模塊名為ssh卦洽,如果配置http,則模塊名為http斜棚。
創(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ù)脂新。
創(chuàng)建模塊配置文件service.pp
Vi /etc/puppet/modules/ssh/manifests/service.pp
class ssh::service{
service{ "sshd":
ensure =>running,//確定sshd運(yùn)行
hasstatus=>true,
//puppet該服務(wù)支持status命令,即類似service
sshd status命令
hasrestart=>true,
//puppet該服務(wù)支持status命令粗梭,即類似service
sshd status命令
enable=>true,//服務(wù)是否開機(jī)啟動
require=>Class["ssh::config"] ???//確認(rèn)config.pp調(diào)用
}
}
創(chuàng)建模塊主配置文件init.pp
Vi ?/etc/puppet/modules/ssh/manifests/init.pp
上面一共建立了4個文件争便,確保建立好
建立服務(wù)器端ssh統(tǒng)一維護(hù)文件
由于服務(wù)器端和客戶端的sshd_config文件默認(rèn)一樣,此時將服務(wù)器端/etc/ssh/sshd_config復(fù)制到模塊默認(rèn)路徑断医。
創(chuàng)建測試節(jié)點(diǎn)配置文件滞乙,并將ssh加載進(jìn)去
Vi /etc/puppet/manifests/nodes/ssh.pp,輸入以下信息
將測試節(jié)點(diǎn)載入puppet鉴嗤,即修改site.pp
Vi ?/etc/puppet/manifests/site.pp斩启,輸入以下信息:
修改服務(wù)器端維護(hù)的sshd_config配置文件
Vi ?/etc/puppet/modules/ssh/files/ssh/sshd_config
重新啟動puppet
配置客戶端主動拉取
一般在小規(guī)模自動化群集中,如代碼上線需要重新啟動服務(wù)時醉锅,為了防止網(wǎng)站暫時性無法訪問的問題兔簇,每臺客戶端需要運(yùn)行一次puppet agent -t命令,所以選擇模式時需要根據(jù)規(guī)模的大小來決定,一般運(yùn)維工程師puppet服務(wù)器到各客戶端建立ssh信任垄琐,然后自定義腳本边酒,ssh讓客戶端批量執(zhí)行puppet命令同步。
在客戶端puppetclient1上執(zhí)行命令:
然后在客戶端上查看ssh配置文件的端口是否改變狸窘,并查看端口運(yùn)行狀態(tài):
Vi /etc/ssh/sshd_config
由上圖可以看出墩朦,客戶端的ssh端口已經(jīng)變成9922,而且ssh服務(wù)自動重啟了翻擒,說明我們的實(shí)驗(yàn)做對了氓涣。但是如果都由客戶端自己拉取的話,可以想象如果有幾百甚至上千臺服務(wù)器呢陋气,客戶端拉取一定是不可取的劳吠,所以我們可以采用另一種方式,就是服務(wù)器推送巩趁,只需要在服務(wù)器上執(zhí)行一次命令赴背,所有的客戶端都會同步,這樣工作會更輕松一些晶渠。
服務(wù)器推送同步
修改puppet主配置文件
Vi ?/etc/puppet/puppet.conf,在最后添加一行燃观,使puppet監(jiān)聽8139端口
修改puppet驗(yàn)證配置文件褒脯,定義權(quán)限
在最后一行添加下面的內(nèi)容
啟動puppet客戶端
3)再次把服務(wù)器的ssh配置文件端口改為9933(換一個試試)
開始向客戶端推送
在客戶端查看端口是否改變
客戶端ssh端口已經(jīng)改變,實(shí)驗(yàn)正確缆毁。但是今天僅僅是做了ssh同步的一個應(yīng)用案例番川,實(shí)際上puppet功能十分強(qiáng)大,應(yīng)用非常靈活脊框,運(yùn)維的工作基本上它都可以完成自動化颁督,相關(guān)腳本在網(wǎng)上有很多,大家可以查詢練習(xí)浇雹。
腳本如下:
#!/bin/bash
#先更改/etc/sysconfig/network文件的主機(jī)名并更改好腳本中對應(yīng)的本機(jī)ip地址后沉御,執(zhí)行此腳本,完成后重啟系統(tǒng)使主機(jī)名更改生效
service iptables stop
chkconfig iptables off
echo "DEVICE=eth0
IPADDR=192.168.1.131">/etc/sysconfig/network-scripts/ifcfg-eth0
service network restart
echo? "
127.0.0.1?? localhost localhost.localdomain
192.168.1.131 master.test.cn
192.168.1.132 client.test.cn
192.168.1.137 client137.test.cn">/etc/hosts
cd /usr/src
rpm -ivh compat-r* ruby-*
useradd -s /sbin/nologin puppet
tar zxf facter-1.7.1.tar.gz
cd facter-1.7.1
ruby install.rb
cd /usr/src
tar zxf puppet-2.7.21.tar.gz
cd puppet-2.7.21
ruby install.rb
總結(jié)昭灵!這是puppt 有時間學(xué)習(xí)一下ansible吠裆!
本文出自 “李世龍” 博客,謝絕轉(zhuǎn)載烂完!