天天看點

庖丁解puppet之進階篇(組織結構設計)

庖丁解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 =&gt; $operatingsystem ? 

{#facter 擷取用戶端作業系統确定包的名稱 

ubuntu =&gt; "cron", 

debian =&gt; "cron", 

redhat =&gt; "vixie-cron", 

centos =&gt; "vixie-cron", }, 

ensure =&gt; present, 

service { crond:

name =&gt; $operatingsystem ? { #确定啟動cron的名稱 

redhat =&gt; "crond", 

centos =&gt; "crond", }, 

ensure =&gt; running, 

enable =&gt; true, 

pattern =&gt; cron, 

require =&gt; Package["cron"], #依賴關系 

}

(2)、編寫crontabs.pp

功能說明:安裝crontabs包

#vim crontabs.pp

class cron::crontabs {

package { crontabs:

name =&gt; $operatingsystem ? {

redhat =&gt; "crontabs",

centos =&gt; "crontabs",

},

ensure =&gt; present,

(3)、編寫addcron.pp

功能說明:添加crontab定時任務(定時同步時間伺服器每4個小時同步的第1分鐘同步)

#vim addcron.pp

class cron::addcron {

cron { ntpdate:

command =&gt; "/usr/sbin/ntpdate time-b.timefreq.bldrdoc.gov",

user =&gt; root,

hour =&gt; '*/4',

minute =&gt; '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 =&gt; “powerlgh is test puppet”,

#cat host

Ha ,ha

# cat init.pp

##systembase class modules

Class systembase {

#system files

File { “/opt/host”: #一個語句的開始用冒号

Mode =&gt; 0644, #語句中間用逗号

Source =&gt; “puppet://$fileserver/systembase/host”; #一個語句結束後使用分号

<a href="http://blog.51cto.com/attachment/201203/171451606.jpg" target="_blank"></a>

1所有的配置檔案最後都要被主site.pp引用。

主線是:1 class目錄下的類.pp=&gt;服務的主配置檔案init.pp=&gt;引用子產品的mudule.pp

2 node檔案夾下伺服器分組node節點.pp(例如C.pp)=&gt;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 =&gt; "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 =&gt; "puppet://$puppetserver/java-web/java.war",

notify =&gt; Exec["exec-java-web-update"],

exec

{ "exec-java-web-update":

cwd =&gt; "/root/scripts",

command =&gt; "sh /root/scripts/update_java_web.sh",

user =&gt; "root",

path =&gt; "/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 =&gt; "puppet://$puppetserver/puppet-web/puppet.war",

notify =&gt; Exec["exec-puppet-web-update"],

{ "exec-puppet-web-update":

command =&gt; "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,如需轉載請自行聯系原作者