已經有2年多的時間沒有寫博客來。有點很差意思,但在奇虎360真的是太忙了,沒有那麼多精力來寫博客。linux
今天是週末抽出一點時間來更新一下本身的博客,但願本身的博文可以給你們有些許幫助。也但願經過博客nginx
認識更多的運維朋友,你們一塊兒學習,一塊兒進步。shell
原來寫過一篇puppet搭建的文章,今天跟你們分享的是puppet「資源」。什麼是資源?全部由puppet的統一的管理的不論是文件、目錄、安裝包、cron、腳本等都稱之爲資源。你們在用puppet的時候最常常作的事情也就是來定義資源,而後用定義好的資源來統一管理和配置服務器資源,以達到節約維護成本和儘可能避免人爲故障的目的。數組
下面來用我工做當中的實際場景跟你們分享經常使用的資源定義。服務器
這個pp文件是我/etc/puppet/modules下的一個業務的pp文件內容。運維
說明一下,個人這個puppet管理公司幾個不一樣的業務。不一樣的業務在puppet裏面都是以模塊的方式存在,全部的模塊都在/etc/puppet/modules目錄下存放。而後每一個模塊下都有三個目錄,分別是files manifests templates。files目錄主要是存放模板文件和目錄的;manifests是聲明目錄,也就是存放以pp結尾的聲明文件;templates是用來存放模板文件的,下面有實例來講明它的做用。ide
下面這個文件的名字叫init.pp也就是初始化pp,它也能夠include其餘文件進來。該文件內容以下:工具
class syewu::conf { 學習
#class是來定義一個類,syewu是個人業務名稱,兩個冒號後面的conf就是該類的名稱。spa
file { "hosts":
#file是來定義文件的,後面的hosts只是一個文件的標識,並非文件的名稱,能看到這個標識想到是你想定義的哪一個文件就ok了。
source => "puppet:///modules/syewu/hosts",
#source是來定義該文件的來源的,這裏是說文件來源於syewu模塊下的files/hosts。也就是我上面說的每一個模塊下都有一個files目錄的做用。注意冒號後面有三個斜線。
path => "/etc/hosts",
#path是puppet客戶端要同步的文件在實際操做系統中的位置。注意是絕對路徑。
mode => "644", owner => "root", group => "root",
#這一行你們應該能看的懂。文件的權限和屬主/屬組。
}
$arr_package = ["qihoo-ops-nginx", "Qihoo-lockf"]
#定義一個數組,我這裏是定義的這個業務下須要安裝的rpm包。
package { $arr_package:
#調用我前面定義的數組
provider => "yum",
#provider是指誰來提供剛纔定義的rpm包,
ensure => installed,
#ensure後面指的是動做,也就是安裝這些包。若是已經安裝則忽略。
file { "/usr/local/nginx/conf/include":
source => "puppet:///modules/syewu/nginx/conf/include",
mode => "644", owner => "nginx", group => "nginx",
ignore => '*statdata*',
#前面三行前面已經介紹;ignore是忽略的意思,這裏是指忽略include目錄下包含statdata的全部文件和目錄。
recurse => true,
#這個選項必定要注意,recurse是遞歸的意思。也就是說include目錄下全部的文件和目錄,以及該目錄下的全部子文件和子目錄。
purge => true,
#這個選項也要注意,它是強制一致的意思。好比客戶端的include目錄下有一個文件a,但puppet server端定義的include目錄下沒有該文件,則客戶端會強制刪除該文件,若是不加這個選項,客戶端會保留這個文件。
notify => Service["nginx"],
#notif是通知的意思,也就是說若是include目錄下內容有變更,則通知服務nginx作重啓操做。
}
file { "/home/shells":
#file也能夠這樣來定義,直接在第一行來定義客戶端實際存放文件的位置。注意在linux下,文件和目錄均可以統稱爲文件。
source => "puppet:///modules/syewu/shells",
mode => "755", owner => "root", group => "root",
recurse => true,
#同步該目錄下的全部文件,保證這些文件都有可執行權限。我喜歡把本身常常用的腳本都放到一個目錄下,這樣比較容易找到,也方便批量操做。
file { "nginx-processor":
path => "/usr/local/nginx/conf/processor.conf",
mode => "644", owner => "nginx", group => "nginx",
content => template("syewu/processor.erb"),
#我維護的這個業務有幾百臺機器,並且服務器的配置都是不同的,有的是8核,有的16核等。而我nginx啓動的時候我想讓nginx進程數跟服務器cpu的核數是同樣的。這樣一來必然致使nginx的配置不一致。後來我想了一個辦法,讓nginx的主配置文件是同樣的,在主配置文件include進來一個processor.conf。這個文件來控制nginx的啓動數。content是內容的意思,template是指模板。也就是在模塊syewu的templates目錄下有一個模板文件,名字是 processor.erb。這個模板的內容以下:
worker_processes <%= scope.lookupvar("processorcount") %>; 注意processorcount是linux下facter工具裏面的一個變量,在linux下執行facter能夠看到這個變量,這個變量的意思是查看linux下cpu的核心數。
}
exec { "/create-qihu-yum":
#exec是執行的意思,後面也是對要執行內容的一個標識,不是實際要執行的腳步。
command => "sh /home/gehailong/yum-qihu.sh",
#command後面纔是要執行的內容。
path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/", "/usr/local/bin", "/usr/local/sbin" ],
#注意我這裏定義path的做用。它跟系統裏的path含義相似,也就是說從你定義的路徑中來搜索你要執行的命令。
creates => "/etc/yum.repos.d/CentOS-QH.repo",
#creates是指前面執行腳本的結果是來建立這個repo文件的內容。
}
service { "nginx":
#service是來定義一個服務
enable => true,
#enable是指該服務的狀態爲存在。
ensure => running,
#ensure是指這個服務要處於running狀態,若是不是則啓動該服務。
hasstatus => "false",
hasrestart => "false",
restart => "/etc/init.d/nginx reload",
start => "/etc/init.d/nginx start",
stop => "/etc/init.d/nginx stop",
status => "/etc/init.d/nginx status",
}
cron {'xitongbu-jiankong':
#cron是來定義linux的計劃任務。後面是對該計劃任務的描述。
command => "/usr/local/monitor/generic_monitor/control.py",
#command是實際計劃任務的內容。
user => root,
#user指用哪一個用戶來定義該計劃。
minute => '0-59/5',
#這裏是定義時間,minute是分鐘,還能夠定義hour等內容。注意這裏也支持通配符,好比*
ensure => absent ,
#ensure後面的absent的意思是取消客戶端的這跟cron。好比批量解除客戶端原來定義的一個cron就能夠這樣來作。都刪除以後就能夠把這段注掉來。
}
}
先跟你們分享這些吧。寫的比較倉促,有些的不妥的地方,歡迎你們來吐槽!!!