庖丁解puppet之進階篇
(組織結構設計)
前言:
一、常見結構整理
看了網上無數資料,通過億圖畫出了以下三種結構,紅色的表示根目錄,桔色的表示目錄,藍色的表示檔案。因為我處于探索puppet中,是以不好說誰好誰壞,根據我目前個人的了解,我覺得圖二比較适合我公司用,linux伺服器不多,隻有70台左右,其它幾百台伺服器都是windows,用不上puppet。圖一,太過于簡單,如果節點伺服器一多,結構勢必會有點亂,圖三,過于精細化,對上千台伺服器的規模有用。
<a target="_blank" href="http://blog.51cto.com/attachment/201203/171041759.jpg"></a>
(1)、編寫base.pp
功能說明:安裝cron包并啟動服務
#vim base.pp
class cron::base {
package { cron:
name => $operatingsystem ?
{#facter 擷取用戶端作業系統确定包的名稱
ubuntu => "cron",
debian => "cron",
redhat => "vixie-cron",
centos => "vixie-cron", },
ensure => present,
}
service { crond:
name => $operatingsystem ? { #确定啟動cron的名稱
redhat => "crond",
centos => "crond", },
ensure => running,
enable => true,
pattern => cron,
require => Package["cron"], #依賴關系
}
(2)、編寫crontabs.pp
功能說明:安裝crontabs包
#vim crontabs.pp
class cron::crontabs {
package { crontabs:
name => $operatingsystem ? {
redhat => "crontabs",
centos => "crontabs",
},
ensure => present,
(3)、編寫addcron.pp
功能說明:添加crontab定時任務(定時同步時間伺服器每4個小時同步的第1分鐘同步)
#vim addcron.pp
class cron::addcron {
cron { ntpdate:
command => "/usr/sbin/ntpdate time-b.timefreq.bldrdoc.gov",
user => root,
hour => '*/4',
minute => '1'
(4)、編寫init.pp
功能說明:初始化檔案
#vim init.php
class cron {
case $operatingsystem {
centos: {
include cron::base
include cron::crontabs
redhat: {
include cron::addcron #這三行實作安裝添加cron功能
debian: { include cron::base }
ubuntu: { include cron::base }
freebsd: { }
(5)、編寫主manifests檔案實作讓用戶端安裝cron和添加一條crontab作業。
#cd /etc/puppet/manifests
#vim modules.pp #加載cron子產品
import "cron"
#vim nodes.pp #用戶端節點管理檔案
node 'client.puppet.com'{
include cron
#vim site.pp #加載modules.pp 和nodes.pp
import "modules.pp"
import "nodes.pp"
重新開機服務端服務
# /etc/init.d/puppetmaster start
用戶端
執行同步
# puppetd --server server.puppet.com --test
<a target="_blank" href="http://blog.51cto.com/attachment/201203/171122315.jpg"></a>
manifests/
|– modules.pp #子產品導入接口,使用import systembase(子產品名)方式導入
|– node.pp #節點檔案,在節檔案裡面include 子產品
|– site.pp #puppet主要入口
modules/
|– systembase #子產品的名稱
|—templates #模闆目錄
|– files #檔案目錄
|– hosts
|– vimrc
|– manifests #子產品主入口
|– init.pp #這個檔案是必須存在的
#cat modules.pp
Import “systembase”
#cat node.pp
Node ‘node.xxxx.com’{ #node.xxxx.com 是用戶端的hostname
Include systembase #如果同時導入多個子產品用逗号隔開
#cat site.pp
Import “node.pp” #導入節點檔案
Import “modules.pp” #導入子產品檔案
Node default { #預設節點測試内容
File { “/tmp/lightest.txt”:
Content => “powerlgh is test puppet”,
#cat host
Ha ,ha
# cat init.pp
##systembase class modules
Class systembase {
#system files
File { “/opt/host”: #一個語句的開始用冒号
Mode => 0644, #語句中間用逗号
Source => “puppet://$fileserver/systembase/host”; #一個語句結束後使用分号
<a href="http://blog.51cto.com/attachment/201203/171451606.jpg" target="_blank"></a>
1所有的配置檔案最後都要被主site.pp引用。
主線是:1 class目錄下的類.pp=>服務的主配置檔案init.pp=>引用子產品的mudule.pp
2 node檔案夾下伺服器分組node節點.pp(例如C.pp)=>node檔案夾下site.pp
3主配置site.pp把1的mudule.pp 和2的node檔案夾下site.pp 去“ import”。
2但是site.pp,不是唯一的,我們可以建無數的site.pp,需要在/etc/puppet/manifests目錄下
3 維護方法:
3.1增加服務為子產品,在/etc/puppet/module目錄下建立檔案夾。
3.2隻需要維護此子產品下的class下的檔案,配置檔案全部引用變量,在對應的node裡面“ include”類,并且申明變量值。
其中重要檔案配置(我這裡主要是ice的更新和復原):
#cat manifests/node/site.pp
import “java.pp”
import “c.pp”
#cat modules/revfsserver/manifests/init.pp
import “class/*.pp”
#cat manifests/node/c.pp
node ‘client.dongwm.com’ {
$group=”dongwm”
$owner=”dongwm”
$tar=”X.tar.gz”
$homedir=”/opt/newfs/bin”
$tardir=”/opt/src”
$path=”/usr/bin:/usr/sbin:/bin”
include ice::base
include ice::update
include ice::rollback
# cat manifests/site.pp
import “node/site.pp”
import “node/module.pp ”
#cat manifests/module.pp
import “ice”
二、執行個體操作
目的:
通過子產品化編寫,實作兩台web客戶機更新web站點
<a target="_blank" href="http://blog.51cto.com/attachment/201203/171229624.jpg"></a>
<a href="http://blog.51cto.com/attachment/201203/171658601.jpg" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201203/171650603.jpg" target="_blank"></a>
2.1搭建結構
<a href="http://blog.51cto.com/attachment/201203/171734608.jpg" target="_blank"></a>
2.2結構解說:
所有的PP,最後都是site.pp裡進行引用,modules下面根據業務建立檔案夾,每個檔案夾就是一個子產品。這裡的案例是更新java和puppet的兩個web伺服器,是以取名為java-web,puppet-web。所有的子產品,都在node.pp和modules.pp裡引用,注意node.pp裡引用,用的關鍵詞是include,不是import。每個子產品下,必須有個init.pp。
[root@testsns manifests]# more site.pp
import "node.pp"
node default {
file {
"/tmp/lghtest.txt":
content => "powerlgh is test puppet",
[root@testsns manifests]# more node.pp
node 'nfstest' {
include java-web
node 'kaifa' {
include puppet-web
[root@testsns manifests]# more modules.pp
import "java-web"
import "puppet-web"
[root@testsns manifests]# more init.pp
##java-web class modules
class java-web {
file
{ "/opt/java-web-update-file/java.war":
source => "puppet://$puppetserver/java-web/java.war",
notify => Exec["exec-java-web-update"],
exec
{ "exec-java-web-update":
cwd => "/root/scripts",
command => "sh /root/scripts/update_java_web.sh",
user => "root",
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
init.pp
##puppet-web class modules
class puppet-web {
{ "/opt/puppet-web-update-file/puppet.war":
source => "puppet://$puppetserver/puppet-web/puppet.war",
notify => Exec["exec-puppet-web-update"],
{ "exec-puppet-web-update":
command => "sh /root/scripts/update_Puppet_web.sh",
2.3伺服器端執行:
[root@testsns manifests]# puppetrun nfstest kaifa
<a href="http://blog.51cto.com/attachment/201203/171855725.jpg" target="_blank"></a>
2.4用戶端檢視日志:
[root@nfstest opt]# tail -f /var/log/messages
<a href="http://blog.51cto.com/attachment/201203/171906487.jpg" target="_blank"></a>
[root@kaifa puppet]# tail -f /var/log/messages
<a href="http://blog.51cto.com/attachment/201203/171918663.jpg" target="_blank"></a>
2.5打開網站,再次驗證:
<a href="http://blog.51cto.com/attachment/201203/171931955.jpg" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201203/171939826.jpg" target="_blank"></a>
嗯,達到效果了。
三、總結:
把開發部送過來的包,丢到modules目錄下的files檔案裡,然後執行puppetrun host1 host2 host… 就行了,不過實驗中發現,用戶端預設是每半小時去連接配接一次puppet伺服器端,不管有沒有更新,sh更新腳本還是執行了,這是個嚴重問題,解決辦法有兩個,一是把用戶端的間隔時間延長,但能延多長,網上的資料沒說,二是不起puppet用戶端,登入到用戶端手工執行,這種方式,在我公司不多的伺服器上還是可取的,本身每次更新的程式,誰都無法保證能正常更新在生産環境中,即時通過測試環境通過了,是以每次我在更新程式時,先看catalila.out日志,有沒有報錯,有錯,程式一定有問題,沒錯,再打開頁面通路一下,是否正常。
本博文參考了以下博文:
http://www.issacy.com/archives/587.html
http://dongwm.blog.51cto.com/2621371/471163
http://my.oschina.net/duxuefeng/blog/36201
四、後記:
因個人精力有限,加上我公司的linux伺服器不到100台,是以用puppet來作統一管理,真是浪費了puppet,我會在網站war更新中應用它,也就是應用它的file傳輸及shell指令執行兩個功能,至于更深入的erb檔案編寫,就不去研究了,通過初級篇,中級進階篇,到本文的進階篇,管理1000台以下的伺服器,是可行的了。
本文轉自itwork 51CTO部落格,原文連結:http://blog.51cto.com/369369/807971,如需轉載請自行聯系原作者