Linux Puppet基礎知識linux
Puppet能夠批量配置多個節點,減小運維人員在重複的、繁瑣的工做中花費的時間;能夠輕鬆的管理幾千個節點;nginx
官網地址:https://puppet.com/web
Puppet相對於ansible來講,其不只要運行master端,且在每一個被管控節點上還要安裝並運行agent端;正則表達式
master:puppet servershell
agent:agent週期性(默認爲30分鐘)的到master端請求與本身相關的配置,進而在本地執行(因此說agent纔是真正管理節點的部件),而後將執行結果報告給master端;apache
Note:master與agent使用本身的私有認證機制進行認證,其實也就是ssl,只不過master自建了一個私有CA進行證書籤發;編程
Puppet工做模式:ubuntu
定義:使用puppet配置語言定義基礎配置信息(資源狀態);centos
模擬:先在本地模擬執行一遍,若是執行沒有錯誤再應用到各個節點;api
強制:比對節點狀態與定義的資源狀態是否一致,若是不一致則agent執行相關配置;強制使當前與定義的目標狀態保持一致;
報告:經過puppet API將日誌發送到第三方監控工具,進行監控;還會向master報告相應的執行結果;
Puppet的三層模型:
頂層(Configuration Language,配置語言):定義基礎配置信息;
中層(Transactional Layer,事務層):解決資源之間的依賴關係;好比要想啓動某個服務,必需要先安裝這個服務才行;
底層(Resource Abstraction Layer,資源抽象層):將主機上每一個可被管理的對象都被定義爲資源;
這樣抽象實現之後,能夠將每一個對象與其實現方式隔離開來;好比在系統中安裝一個軟件,在Ubuntu(apk)中安裝和在Centos(yum)中安裝是不一樣的,由於它們使用的工具不一樣,可是經過這個層的隔離,就能夠將具體的實現支持透明化,僅給出要安裝的軟件包,具體的實現交給puppet就能夠了;
資源類型:例如用戶、組、文件、服務、cron任務等;
屬性及狀態與其實現方式相分離;
每一個資源的指望狀態;
Puppet的核心組件:資源
資源清單:manifests,即便用到的資源的列表文件;還有一個叫站點清單:即資源清單的清單,能夠理解爲是應用到某一遠端被管控節點的資源清單的組合;
模塊:資源清單及清單中的資源定義的所依賴的文件、模板等數據按特定結構組織起來即爲模塊;模塊最大的好處就是能夠實現代碼重用,從而簡化了繁雜的工做;
Puppet工做過程:
類型1:僅在本地應用
Puppet能夠設置多個資源清單,每一個資源清單包含不一樣資源,用於實現不一樣配置功能;設置完資源清單之後,Puppet會對資源清單進行編譯,進而生成僞代碼(catalog),而後才能在本地節點上應用(執行);
類型2:在具備被控的遠端節點上應用
agent節點會週期性向master發送請求信息而且發送本身的facts信息(包括主機名、IP地址、CPU核心數等),請求與本身的相關的配置;當master收到agent的請求時,會根據其主機名在本地進行查找,搜尋與請求agent相關的資源清單(manifest),若是找到相匹配的資源清單,則在本地進行編譯,生成僞代(catalog),而後將僞代碼發送給請求的agent,接着agent會在本地應用這個僞代碼,最後將應用結果報告給master端;
Puppet的master與agent是經過HTTPS協議通訊的;由於master端自帶CA,因此咱們能夠經過master的CA給每一個受其管理的agent端發放證書,從而實現安全通訊;
Puppet安裝:
能夠在官網下載安裝,也能夠直接使用yum安裝;
agent節點須要安裝puppet和facter包;
master節點須要安裝puppet、facter和puppet-server包;
puppet命令用法:具體用法在下面使用時再解釋;
幫助:puppet help [subcommand]
查看puppet的各類資源類型的信息:puppet describe
Usage: puppet <subcommand> [options] <action> [options]
定義資源:
格式:
type {‘title’:
attribute1 => value,
attribute2 => value,
……
}
示例:
user {‘guowei’:
uid => 1000,
gid => 1000,
shell => ‘/bin/bash’,
home => ‘/home/guowei’,
ensure => present,
}
特殊變量:
Name/Namevar
大多數資源都有一個Namevar屬性,若是過不指出,則title則爲此種資源的Namevar變量的值;好比user的Namevar爲name,file的Namevar爲file;
Ensure
大多數資源都支持的屬性,用於控制此種資源的存在性;其取值通常根據資源的不一樣而不一樣,大致有:present表示存在或者建立、absent表示不存在或者刪除;
Metaparameters
經常使用資源類型:
user,group,file,package,service,exec,cron,notify等;
~]# puppet describe user
經常使用屬性:
comment:描述信息;
ensure:建立或刪除用戶,有兩個取值:present、absent;
expiry:帳戶的過時期限;
gid:帳號所屬的基本組;
groups:帳號所屬的附加組;
home:家目錄;所指定的目錄須要事先建立,且權限正確;
name:用戶名,且爲Namevar;
password:帳號密碼;
password_max_age:密碼最長使用期限;
password_min_age:密碼最短使用期限;
shell:帳號使用的shell類型;
system:帳號是否爲系統用戶,有四個取值:true|yes,false|no;;
uid:UID,無需解釋;
~]# puppet describe group
經常使用屬性:
ensure:建立或者刪除組,有兩個取值:present、absent;
gid:GID,無需解釋;
name:組名,且爲Namevar;
system:是否爲系統組;有四個取值:true|yes,false|no;
members:指定組成員,本身爲組成員的附加組;
示例:
~]# cat test1.pp 此類文件約定成俗以」.pp」結尾
group {'distro':
gid => 2000,
ensure => present,
}
user {'centos':
uid => 2000,
gid => 2000,
shell => '/bin/bash',
home => '/home/centos', 若是是建立用戶,則須要此目錄已經事先存在,且權限正確;
ensure => present, 表示建立這個用戶,若是是absent的話就是刪除這個用戶;
}
使用了兩個資源類型(group和user),分別應用了幾個其特有的屬性,屬性的做用就是字面意思,很好理解;
puppet apply:在本地直接應用資源清單定義的資源,無需通過master管理;
用法:puppet apply [-h|--help] [-v|--verbose] [--noop] <file>
-h:查看詳細的幫助信息;
-v:應用時顯示詳細信息;
--noop:測試應用(執行),而不是真正的應用(執行);
~]# puppet apply -v test1.pp
~]# puppet describe file
用途:主要用於管理文件及其內容|從屬關係|權限、目錄、符號連接;
經常使用屬性:
checksum:校驗文件完整性;
source:從指定路徑下載文件,能夠是遠程也能夠是本地,通常用於agent從master下載相關配置文件;若是是遠端路徑通常格式爲:puppet:///modules/MODULE_ANME/FILE_ANME;
content:編寫文件內容,使用」\n」做爲換行符、」\t」做爲製表符;
ensure:取值爲:present、absent、file、directory、link;
recurse:遞歸處理目錄或其中的文件,只有當ensure爲directory時才起做用;
force:強制執行,有四個取值:true|yes,false|no;;
group:屬組;
owner:屬主;
mode:權限:
格式:<who><op><perm>
* "who" should be u (user), g (group), o (other), and/or a (all)
* "op" should be = (set exact permissions), + (add select permissions),or - (remove select permissions)
* "perm" should be one or more of:
* r (read)
* w (write)
* x (execute/search)
* t (sticky)
* s (setuid/setgid)
* X (execute/search if directory or if any one user can execute)
* u (user's current permissions) 使用用戶的當前權限
* g (group's current permissions)
* o (other's current permissions)
Note:或者使用數字表示權限;
mtime:最近修改時間;
path:目標路徑,且爲Namevar;
target:被建立連接文件的文件;不能與source和content一塊兒使用且ensure需爲link;此時path或title指定的文件爲連接文件;
示例:
]# cat test2.pp
file {'/tmp/mydir/':
ensure => directory,
}
file {'/tmp/puppet.file':
content => 'puppet testing\nhello world!',
ensure => file,
owner => 'centos',
group => 'distro',
mode => 0400,
}
file {'fstab':
path => '/tmp/fstab.puppet',
source => '/etc/fstab',
ensure => file,
}
file {'/tmp/puppet.link':
ensure => link,
target => '/tmp/puppet.file',
}
]# puppet apply -v -d test2.pp
~]# puppet describe exec
用途:用於運行系統中的命令且要求所運行的命令具備冪等性,也就是一樣的命令運行屢次都是相同的結果;
冪等性:
1.命令自己具備冪等性;
2.資源有onlyif、unless、creates等屬性以實現命令的條件式運行;
3.資源有regreshonly屬性,以實現只有訂閱的資源發生變化時才運行;
經常使用屬性:
command:指定要運行的命令,且爲Namevar;
creates:此屬性指定的文件不存在時才執行此命令;
cwd:指定在哪一個目錄下執行命令;
environment:指定環境變量,通常是不在PATH環境變量中的;
path:指定環境變量;若是不使用path屬性,則須要使用命令的絕對路徑;
group:以哪一個組的身份運行命令;
user:以哪一個用戶的身份運行命令;
onlyif:只有此處指定的命令的運行結果爲成功(即返回值狀態碼爲0)才執行command中的命令;
unless:只有此處指定的命令的運行結果爲失敗(即返回值狀態碼爲非0)才執行command中的命令;
refresh:若是接收到其餘資源發來的refresh通知時,默認是從新執行exec定義的command,可是refresh屬性能夠改變這種行爲,便可指定僅在資源refresh時運行的命令;好比某個服務的配置文件發生了改變,咱們通常都會讓服務重載或者重啓,這種狀況下就能夠經過這個屬性來實現,可是refresh須要接收到某種通知之後才能啓動相應的操做;
refreshonly:只有接收到refresh時才執行command中的命令,不然不作任何操做;可取值爲:true、force;
timeout:命令執行的超時時長;
示例:
]# cat test3.pp
exec {'modprobe ext4':
path => '/usr/sbin:/usr/bin',
user => root,
group => root,
refresh => 'modprobe -r ext4 && modeptobe ext4',
timeout => 8,
tries => 2,
}
exec {'/bin/echo world > /tmp/hello.txt':
user => root,
group => root,
creates => '/tmp/hello.txt',
}
exec {'/bin/echo centos7 > /tmp/hello2.txt':
user => root,
group => root,
unless => '/usr/bin/test -f /tmp/hello2.txt',
}
~]# puppet describe notify
用途:用於顯示一些提示信息;
經常使用屬性:
message:要發送的消息的內容;
~]# puppet describe cron
用途:設定週期性任務;
經常使用屬性:
command:指定要運行的命令;
ensure:添加或刪除cron任務,取值爲:present、absent;
minute:指定分鐘;
hour:指定小時;
month:指定月份;
monthday:指定某月的第幾天,最大取值範圍爲1-31;
weekday:指定星期,取值爲0-7且0與7是同一天;
user:指定是哪一個用戶的cron任務;
name:cron任務的名稱;
target:指定存儲cron任務的文件路徑;
environment:運行cron任務的環境變量;
示例:
]# cat test5.pp
cron {'sync time':
command => '/usr/sbin/ntpdate api.api.bz &> /dev/null',
ensure => present,
hour => '*/3',
}
~]# puppet describe package
用途:管理程序包;
經常使用屬性:
configfiles:指定安裝新的程序包或者從新安裝程序包時,對於以前已經存在配置文件的處理方式;有兩個取值:keep(保存)、replace(替換);
ensure:安裝或卸載程序包;取值爲:latest(安裝最新版)、指定程序包的版本(VERSION(2.5.3-2.el7))、absent、present|installed、purged(清除);
install_options:指定安裝選項;
name:指定安裝包的名稱;
source:指定程序包的安裝源,能夠是本地路徑或者URL;取值能夠爲yum、apt、rpm、dpkg,若是是後二者的話,須要指明具體路徑;
provider:指定安裝方式;可取值爲rpm、dpkg、yum、apt;
示例:
]# cat test6.pp
package {‘zsh’:
ensure => latest,
}
package {‘jdk’:
ensure => installed,
source => ‘/usr/local/src/jdk-8u25-linux-x64.rpm’,
provider => rpm,
}
~]# puppet describe service
用途:管理服務;
經常使用屬性:
binary:指定啓動特定服務的啓動腳本;
enable:指定是否爲開機自動啓動;可取值爲:true、false、manual;
ensure:指定服務狀態;可取值爲stopped|false、running|true;
hasrestart:說明當前啓動服務的機制是否自帶restart功能;若是沒有能夠經過先中止在啓動來從新啓動;
hasstatus:相似於上面;
name:指定服務名稱;
path:指定啓動服務所用到的腳本的路徑;
restart:若是服務的啓動腳本不支持restart選項,則能夠經過這個屬性手動設置重啓方式;
start:相似於上面;
stop:相似於上面;
status:相似於上面;
pattern:用於搜索於此服務相關的進程的模式;當腳本不支持restart/status時,用於肯定服務是否處於運行狀態;
示例:
~]# cat test7.pp
package {'nginx':
ensure => latest,
}
service {'nginx':
ensure => running,
enable => true,
hasrestart => true,
hasstatus => true,
restart => 'systemctl reload nginx.service',
}
特殊屬性:Metaparameters
puppte提供了before(在….以前)、require(在….以後)、notify(本身發生改變之後通知其餘資源)和subscribe(本身監控其餘資源,若是其改變,則進行相應的操做)四個元參數來定義資源間的依賴/通知關係;
這四個參數都以另外其餘資源或資源數組做爲其值,這也成爲資源引用;
資源引用通」Type [title]」(資源引用時,其類型名稱的首字母要大寫)這樣的方式進行,好比User[‘centos’];
1.定義依賴關係(before、require)
用於解決資源之間的依賴關係,好比要啓動一個服務,就要先安裝這個服務,不然就會執行錯誤;
示例:
~]# cat test8.pp
group {'king':
gid => 2500,
ensure => present,
before => User['man'], 在user以前運行;
}
user {'man':
uid => 2500,
gid => 2500,
shell => '/bin/bash',
home => '/home/centos',
ensure => present,
#require => Group[‘king’] 在group以後運行;
}
Note:在表示依賴關係時,還可使用」A ->B 」符號表示A先於B;
2.定義通知關係(notify、subscribe)
用於實現資源之間的信息傳遞,好比當一個服務的配置文件發生改變時,咱們要通知相關的服務腳本從新啓動服務;
示例:
~]# cat test9.pp
package {'nginx':
ensure => latest,
}
file {'/etc/nginx/nginx.conf':
ensure => file,
source => '/root/modules/nginx/files/nginx.conf',
require => Package['nginx'],
notify => Service['nginx'],
}
service {'nginx':
ensure => running,
enable => true,
hasrestart => true,
hasstatus => true,
require => [ Package['nginx'],File['/etc/nginx/nginx.conf'] ],
}
Note:在表示依賴關係時,還可使用」A ~>B 」符號表示A通知B;
變量:
1.Puppte中的變量須以」$」開頭,且使用」=」做爲賦值操做符;
2.任何正常數據類型(除了正則表達式)的值均可以被賦予puppet中的變量;如字符串、數值、布爾值、數組、hash以及特殊的undef值(即變量未被賦值);
3.Puppet的每一個變量都有兩個名字:簡短名稱和長格式徹底限定名稱(FQN),徹底限定名稱的格式爲」$scope::variable」;
做用域:定義代碼的生效範圍,以實現代碼間隔離;
僅能隔離變量、資源的默認屬性;
不能隔離資源的名稱、及其引用;
4.變量的引用方式:
相對路徑: 即直接使用變量名;
絕對路徑:$scope::scope::variable
5.變量的賦值符號:
=:直接賦值;
+=:追加賦值(在原來的基礎上新增內容);
Puppet的數據類型;
字符型:
非結構化的文本字符串,可使用引號,也能夠不用;
單引號中的變量不會替換,而雙引號中的可以進行變量替換;
字符型值也支持使用轉義符;
數值型:
可爲整數或浮點數,不過,Puppet只有在數值上下文(即作數值運算時)才能把數值當數值對待,其餘狀況下一概以字符型處理;
數組:
數組值爲中括號」[ ]」中的以逗號分隔的項目列表,最後一個項目後面能夠有逗號;
數組中的元素能夠爲任意可用數據類型,包括hash或其餘數組;
數組索引爲從0開始的整數,也可使用負數索引;
布爾型:
true或false,使用時不能加引號;
if語句的測試條件和比較表達式都會返回布爾型值;
另外,其餘數據類型也能夠自動轉換爲布爾型,如空字符串爲false;
undef:
從未被聲明的變量的值的類型即爲undef;
也可手動爲變量賦予undef值,即直接使用不加引號的undef字符串;
hash(相似於Python中的字典):
即爲鍵值數據類型,鍵和值之間使用」=>」分隔,鍵值對兒定義在」{ }」中,彼此間以逗號間隔;好比:{‘A’ => ‘12’,’B’ => ‘abc’}
其鍵值爲字符型數據,而值能夠爲Puppet支持的任意數據類型;
訪問hash類型的數據元素要使用」鍵」當作索引進行;
正則表達式:
屬於Puppet的非標準數據類型,不能被賦予給變量,僅能用於有限的幾個接收正則表達式的的地方,即接受使用」=~」及」!~」匹配操做符的位置,一般包括case語句中的selector,以及節點名稱匹配的位置;
不能傳遞給函數或用於資源屬性的定義;
Puppet中的正則表達式支持使用(?<ENABLE OPTION>:<SUBPATTERN>)和(?-<DISABLED OPTION>:<SUBPATTERN>)兩個特殊的符號;
OPTION:
i:表示忽略字符大小寫;
m:表示把.當作換行符;
x:忽略模式中的空白字符和註釋;
示例:
$packages = $operatingsystem ? {
/(?i-mx:ubuntu|debian)/ => ‘apache2’,
/(?i-mx:centos|fedora|redhat)/ => ‘httpd’,
} #若是$operatingsystem與ubuntu|debian| centos|fedora|redhat中任何一個鍵相匹配的話$packages就被賦予鍵所對應的值;
Puppet支持的表達式:
比較操做符:==、>、<、>=、<=、!~、=~、!=、in;
邏輯操做符:and、or、!;
算數操做符:+、-、*、/、%、>>、<<;
示例:
~]# cat test10.pp
$webserver=httpd
package {$webserver :
ensure => latest,
}
Puppet中變量的種類:
自定義變量:即上面所述的變量
facter變量:agent自身支持的變量,通常是有關本身自己屬性的變量,好比主機名、IP地址、CPU顆數等;可經過facter -p查看全部支持的變量;
內置變量:
客戶端內置變量:
$clientcert
$clientversion
服務器端內置變量:
$servername
$serverip
$serverversion
$module_name
Puppet支持的條件判斷語句:
if:
if CONDITION {
statement
……
} -------> 到這爲單分支;
else {
statement
……
} ------->到這爲雙分支;
if CONDITION {
statement
……
}
elsif CONDITION {
statement
……
}
else {
statement
……
} ------->到這爲多分支;
CONDITION的用法:
1.比較表達式;
2.變量引用;
3.有返回值的函數調用;
示例:
~]# cat test11.pp
if $processorcount > 5 {
notice("SMP PC") 這是puppet的一個內置函數,功能相似於notify資源;
}
else {
#notice("KunKun")
notify {'message':
message => "KunKun",
}
}
if $operatingsystem =~ /^(?i-mx:(centos|redhat))/ {
notice(「Welcome to $1 linux server」)
}
case:
case CONTROL_EXPRESS {
Case1,… : {statement…}
Case2,… : {statement…}
……
default : {statement…}
}
CONTROL_EXPRESS:
1.比較表達式;
2.變量引用;
3.有返回值的函數調用;
Case#:
1.比較表達式;
2.變量引用;
3.僅有一個返回值的函數調用;
4.正則表達式;
5.default;
示例:
~]# cat test18.pp
case $operatingsystem {
‘Solaris’ : { notice(「welcome to Solaris」) }
‘Redhat’,’Centos’ : { notice(「welcome to Redhat OSFamily」) }
/^(Debian|Ubuntu)$/ : {notice(「welcome to $1 linux」) }
default : { notice(「welcome,alien *_*」) }
selector:
用於返回一個值,而不是執行一個代碼塊;能夠將這個值賦值給其餘變量;
CONTROL_VARIABLE ? {
case1 => value1,
case2 => value2,
……
default => value#
}
示例:
$webservice = $operatingsystem ? {
/(?i-mx:ubuntu|debian)/ => ‘apache2’,
/(?i-mx:centos|redhat)/ => ‘httpd’,
}
unless:相似於if;
Puppet中的類(class):
用於公共目的的一組資源的集合,相似於代碼塊;建立後可在puppet的全局進行調用,因此類名在全局應該是惟一的,其能夠被應用到全部被管理的節點上;而且類能夠被繼承;
語法格式:
class class_name {
… puppet code …
變量
賦值
條件判斷
資源聲明
……
}
類的名稱只能以小寫字母開頭,能夠包含小寫字母、數字、下劃線;
每一個類都會引入一個新的變臉scope,這意味着在任什麼時候候訪問類中的變量時,都得使用其徹底限定名稱;不過本地scope能夠從新爲top scope中的變量賦予一個新值;
類也可以接收參數;
class class_name($arg1[=’value1’],$arg2[=‘value2’]) {
… puppet code …
}
類只有被聲明之後纔可使用;
聲明變量的方法:
include方式:
include class_name1,class_name,…
require方式:
require class_name1,class_name2,…
像聲明一個資源同樣聲明一個類:
class {‘class_name’ :
arg1 => ‘value1’,
agr2 => ‘value2’,
……
}
使用ENC的風格聲明一個類
示例:
~]# cat test13.pp
class nginx($webserver=’nginx’) { --->默認安裝nginx;
package {$webserver :
ensure => latest,
}
file {'/etc/nginx/nginx.conf':
ensure => file,
source => '/root/modules/nginx/files/nginx.conf',
require => Package['nginx'],
notify => Service['nginx'],
}
service {'nginx':
ensure => running,
enable => true,
hasrestart => true,
hasstatus => true,
#restart => 'systemctl reload nginx.service',
require => [ Package['nginx'],File['/etc/nginx/nginx.conf'] ],
}
}
#include nginx
class {‘nginx’ :
webservice => ‘tengine’, ----->指定安裝tengine;
}
類繼承:
定義方式:
class base_class {
… puppet code …
}
class [base_class::]calss_name inherits base_class {
… puppet code …
}
做用:繼承一個已有的類,並實現覆蓋資源屬性或向資源屬性追加額外值;覆蓋使用」=>」,追加使用「+>」;
類繼承時:
1.聲明子類時,其基類(父類)會被自動首先聲明;
2.基類成爲了子類的父做用域,基類中的變量和屬性默認值會被子類複製一份;
3.子類能夠覆蓋父類中同一資源的相同屬性的值;
Note:咱們能夠將具備會被重複使用的資源放在基類(父類)中,將特有的資源設置在子類中;
示例:
~]# cat test14.pp
class nginx {
$services = $operatingsystemmajrelease ? {
/(?i-mx:6)/ => 'service nginx reload',
/(?i-mx:7)/ => 'systemctl reload nginx.service',
}
package {'nginx':
ensure => latest,
name => nginx,
} ->
service {'nginx':
enable => true,
ensure => running,
hasrestart => true,
restart => $services,
}
}
class nginx::webserver inherits nginx {
Package [‘nginx’] {
#name +> varnish, 引用父類的package資源,而且追加安裝varnish;
name => tengine, #引用父類的package資源,而後覆蓋父類的nginx,改爲安裝tengine;
}
file {'/etc/nginx/nginx.conf':
source => '/root/modules/nginx/files/nginx_web.conf',
ensure => file,
notify => Server['nginx'],
}
}
class nginx::proxy inherits nginx {
file {'/etc/nginx/nginx.conf':
source => '/root/modules/nginx/files/nginx_proxy.conf',
ensure => file,
notify => Server['nginx'],
}
}
include nginx::webserver
Puppet中的模板(基於ERB模板語言):
在靜態文件中使用變量等編程元素,生成適用於多種不一樣環境的文本文件(配置文件);ERB即Embedded Ruby,用於實如今文本文件中嵌入ruby代碼,應用時原來的文本文件不會被改變,但ruby代碼會被執行,執行結果將直接替換原來的代碼;
嵌入代碼的方式:
<%= RubyExpression %>:替換爲表達式的值;
<% Ruby Expression %>:僅執行代碼,而不替換;
<% comment %>:文本註釋信息;
<%%:輸出爲」<%」;
%%>:輸出爲」%>」;
<%- Ruby Expression %>:執行時忽略空白字符;
<% Ruby Expression -%>:執行時忽略空白行;
在模板中使用的變量,包括Puppet中的任意可用變量,但要以」@」開頭;
示例:
~]# cat /root/modules/nginx/files/nginx.conf
worker_processes <%= @processorcount %>;
將變量嵌入到配置文件的模板中;
~]# cat test15.pp
$webserver=nginx
package {$webserver :
ensure => latest,
}
file {'/etc/nginx/nginx.conf':
ensure => file,
content => template('/root/modules/nginx/files/nginx.conf'),
將配置文件模板使用puppet的內置函數輸出爲字節流,而後傳輸給目標配置文件,只有這樣才能夠解析配置文件模板中的變量;
require => Package['nginx'],
notify => Service['nginx'],
}
service {'nginx':
ensure => running,
enable => true,
hasrestart => true,
hasstatus => true,
#restart => 'systemctl reload nginx.service',
require => [ Package['nginx'],File['/etc/nginx/nginx.conf'] ],
}
模塊路徑:
Puppet中的模塊,其實就是一個目錄,而後將須要的文件都已規定的格式放在這個目錄的特定子目錄中,自建的模塊通常都會放在/etc/puppet/modules/中;若是想自建模塊,只須要在此目錄下建立子目錄,這個子目錄的名稱就是模塊的名稱;
模塊目錄(module_name/)包含的文件:
manifests/:用於存放模塊使用的資源清單;且至少要包含init.pp這個文件,且這個文件至少要包含一個與當前模塊名稱同名的類,從而實現自包含、自識別等功能;
files/:用於存放模塊使用的靜態文件;而且在管理agent時,agent須要得到這些只有在master端才具備的文件時,master會自動開啓一種能夠傳輸文件的功能,經過設置puppet:///modules/module_name/file_name(紅色部分爲固定格式)將文件傳輸到agent;
templates/:用於存放模塊使用的模板文件;template(‘module_name/template_name’);
lib/:插件目錄;
tests/:當前模塊的使用幫助及示例文件;
spec/:相似於tests/目錄,存儲lib/目錄下定義的插件的使用幫助及示例文件;
查找、安裝、管理模塊:
puppet module <action> [--environment production ]
[--modulepath $basemodulepath ]
ACTIONS:
build Build a module release package.
changes Show modified files of an installed module.
generate Generate boilerplate for a new module.
install Install a module from the Puppet Forge or a release archive.
list List installed modules
search Search the Puppet Forge for a module.
uninstall Uninstall a puppet module.
upgrade Upgrade a puppet module.
詳細使用方法請查看:puppet help module
示例:
~]# mkdir -pv /etc/puppet/modules/nginx/{manifests,files,templates,tests,lib,spec}
~]# tree /etc/puppet/modules/
/etc/puppet/modules/
└── nginx
├── files
│ ├── nginx_proxy.conf
│ └── nginx_web.conf
├── lib
├── manifests
│ └── init.pp
├── spec
├── templates
│ └── nginx.conf.erb
└── tests
~]# cd /etc/puppet/modules/nginx/
~]# cat manifests/init.pp
class nginx {
$services = $operatingsystemmajrelease ? {
/(?i-mx:6)/ => 'service nginx reload',
/(?i-mx:7)/ => 'systemctl reload nginx.service',
}
package {'nginx':
ensure => latest,
} ->
service {'nginx':
enable => true,
ensure => running,
hasrestart => true,
restart => $services,
}
}
class nginx::webserver inherits nginx {
file {'/etc/nginx/nginx.conf':
#source => '/etc/puppet/modules/nginx/files/nginx_web.conf',
source => 'puppet:///modules/nginx/nginx_web.conf',
ensure => file,
notify => Service['nginx'],
}
}
class nginx::proxy inherits nginx {
file {'/etc/nginx/nginx.conf':
content =>template('nginx/nginx.conf.erb'),
ensure => file,
notify => Service['nginx'],
}
}
~]# puppet apply -v -e 'include nginx::webserver'
指定要應用的的類;
注:根據馬哥視頻作的學習筆記,若有錯誤,歡迎指正;侵刪