實(shí)際生產(chǎn)使用中,默認(rèn)的puppet配置方式對(duì)應(yīng)復(fù)雜的產(chǎn)線使用場(chǎng)景會(huì)遇到各種問(wèn)題,業(yè)務(wù)多而雜,標(biāo)準(zhǔn)需求&&非標(biāo)需求之間的沖突,外購(gòu)系統(tǒng)&&內(nèi)部自研系統(tǒng)的沖突,會(huì)造成各種各樣的需求,所以在使用的時(shí)候會(huì)做一些修改,以下記錄一些常用的功能。
facter
facter是puppet跨平臺(tái)的信息收集工具,支持自定義,
使用facter -p 可以獲取到facter自帶的信息,如開機(jī)時(shí)間,OS版本等等,這些基礎(chǔ)信息非常有用,puppet可以基于這些內(nèi)置facts信息實(shí)現(xiàn)動(dòng)態(tài)配置
自定義facts
- 添加配置,路徑可以自己定義,最后加到FACTERLIB的環(huán)境變量下即可,EP:/var/lib/puppet/my_fact/allusernum.rb
Facter.add(:users) do
setcode do
%x{/bin/cat /etc/passwd |wc -l}.chomp
end
end
- 將配置路徑加到環(huán)境變量?jī)?nèi):
export FACTERLIB=/var/lib/puppet/my_fact/
- 使用:
facter users
63
hiera
hiera 是個(gè)非常實(shí)用的功能,先來(lái)看下傳統(tǒng)puppet的配置方式,比如產(chǎn)線有100個(gè)應(yīng)用,每個(gè)應(yīng)用會(huì)對(duì)應(yīng)一個(gè)puppet的env,配置時(shí)候會(huì)發(fā)現(xiàn)這100個(gè)env里有相同的同步項(xiàng)(module),比如代碼路徑,日志路徑等等,但也會(huì)有不同的同步項(xiàng)目(module),如配置文件等,這樣就導(dǎo)致了相同的同步項(xiàng)需要放在100個(gè)env的目錄下,一旦相同的module有修改,相當(dāng)于要改100遍,更不要說(shuō)這100個(gè)應(yīng)用里也會(huì)存在部分相同的module,這種module和env相互勾連的情況,可想而知多難用。
hiera可以非常好的解決這個(gè)問(wèn)題,實(shí)現(xiàn)類似子類父類繼承的關(guān)系,一個(gè)module可以被多個(gè)env引用,并基于facts的變量值動(dòng)態(tài)識(shí)別環(huán)境
安裝配置hiera
- 安裝
yum install hiera hiera-puppet -y
mv /etc/hiera.yaml /etc/puppet/
ln -s /etc/puppet/hiera.yaml /etc/hiera.yaml
ll /etc/hiera.yaml
- 配置
#hiera 配置
cat /etc/puppet/hiera.yaml
---
#定義配置文件格式
:backends:
- yaml
:hierarchy:
- common #一般編寫的是所有環(huán)境都需要使用的通用配置
- "environment/%{::environment}" #基于環(huán)境的差異化配置
- "osfamily/%{::osfamily}_%{::operatingsystem}" #基于操作系統(tǒng)以及版本的差異化配置
:yaml:
:datadir:"/etc/puppet/hieradata" #存放上面hierarchy的配置路徑
#環(huán)境配置
cat /etc/puppet/environment/sa_common/manifests/site.pp
node default {
hiera_inclue('basic_setting')
hiera_inclue('env_setting')
hiera_inclue('os_setting')
}
#所有環(huán)境需要的通用配置
cat /etc/puppet/hieradata/common.yaml
---
basic_setting:
- basic_dns
- basic_user
app_setting:
- basic_app_cfg
#不同環(huán)境的特殊配置
cat /etc/puppet/hieradata/environment/sa_env.yaml
---
env_setting:
- env_cfg
- env_user
#不同OS版本的差異配置
cat /etc/puppet/hieradata/osfamily/RedHat_7.5.yaml
---
os_setting:
- rh7_yumrepo
#上面的配置里存放的均是puppet的modules
ls /etc/puppet/modules/
basic_dns
basic_user
basic_app_cfg
最后在客戶端執(zhí)行puppet agent -t 同步時(shí),同步就會(huì)從comm開始自上而下進(jìn)行匹配同步,當(dāng)然實(shí)際產(chǎn)線運(yùn)用中,配置項(xiàng)會(huì)用的多的多,這邊只是記錄一下配置實(shí),避免忘記
mcollective
mco 框架,我們產(chǎn)線服務(wù)器數(shù)量大約高峰在1.6-1.8W臺(tái)VM+BM,平時(shí)在1.2W左右,大規(guī)模主機(jī)集群可以通過(guò)之前的橫向擴(kuò)展方式進(jìn)行部署,但我們有需求需要進(jìn)行短時(shí)間內(nèi)主動(dòng)推送,就會(huì)有問(wèn)題,比如產(chǎn)線6000臺(tái)主機(jī)需要同步配置文件A,另外6000臺(tái)需要同步配置文件B,需要在1小時(shí)內(nèi)完成,(雖然Slat-stack等類似可以很簡(jiǎn)單的完成。。但這里還是只先記錄puppet。。),這種場(chǎng)景下使用puppet kick 也不現(xiàn)實(shí),更別說(shuō)高版本的puppet 還把這個(gè)命令移除了。所以用mco的方式推送會(huì)比較好,mco說(shuō)白了就是一個(gè)推送框架,server端和client端都鏈接中間件(rabbitmq&&activemq)然后通過(guò)消息廣播的方式進(jìn)行命令下發(fā),mcoserver端支持客戶端的自動(dòng)發(fā)現(xiàn),以及推送的正則表達(dá)式,可以 基于facts的返回進(jìn)行推送,但實(shí)際使用下來(lái)并不是很穩(wěn)定,且廣播方式推送雖然很快,6000臺(tái)大約在1min內(nèi)能完成,但是由于使用的是異步方式,mco客戶端只會(huì)告訴server端我執(zhí)行了puppet同步,但同步結(jié)果卻不會(huì)返回,所以也存在一定局限性。
- Rabbitmq
搭建省略。產(chǎn)線集群搭建可以參考之前的筆記
- Mco服務(wù)端
yum install mcollective mcollective-common -y #依賴rubygem-stomp、rubygems和ruby相關(guān)包,在puppet5.x版本中 mcollective 已經(jīng)隨puppet安裝,無(wú)需另外安裝
cat /etc/mcollective/server.cfg
topicprefix = /topic/
main_collective = mcollective
collectives = mcollective
libdir = /usr/libexec/mcollective #插件位置
logfile = /var/log/mcollective.log
loglevel = info
daemonize = 1
# Plugins
securityprovider = psk
plugin.psk = a36cd839414370e10fd281b8a39ada9 #MCollective通信共享密鑰,和MCollective客戶端保持一致
connector = stomp #通信協(xié)議
plugin.stomp.host = 21.66.127.1 #Middleware地址
plugin.stomp.port = 61613 #Middleware監(jiān)聽端口
plugin.stomp.user = mcollective #Middleware通信賬號(hào)
plugin.stomp.password = secret #Middleware通信密碼
# Facts
factsource = yaml
plugin.yaml = /etc/mcollective/facts.yaml
/etc/rc.d/init.d/mcollective start
chkconfig mcollective on
- Mco 客戶端
yum install mcollective mcollective-common -y #依賴rubygem-stomp、rubygems和ruby相關(guān)包
cat /etc/mcollective/client.cfg
topicprefix = /topic/
main_collective = mcollective
collectives = mcollective
libdir = /usr/libexec/mcollective
logger_type = console
loglevel = warn
# Plugins
securityprovider = psk
plugin.psk = a36cd839414370e10fd281b8a39ada9 #MCollective通信共享密鑰,和MCollective服務(wù)端保持一致
connector = stomp #通信協(xié)議
plugin.stomp.host = 21.66.127.1 #Middleware地址
plugin.stomp.port = 61613 #Middleware監(jiān)聽端口
plugin.stomp.user = mcollective #Middleware通信賬號(hào)
plugin.stomp.password = secret #Middleware通信密碼
# Facts
factsource = yaml
plugin.yaml = /etc/mcollective/facts.yaml
- 通信
mco ping