puppet簡介
Puppet是一個IT基礎設施自動化管理工具,它能夠幫助系統管理者管理基礎設施的整個生命周期:供應(provisioning)、配置(configuration)、關聯(orchestration)、及報告(reporting)。
基于puppet,可實作目标管理的幂等性、自動化重複任務、快速部署關鍵性應用以及在本地或雲端完成主動管理變更和快速擴充架構規模等。
基于ruby語言開發,在版本(2.7.0)以後遵循(Apache2.0 license)。
基本工作模型
<a href="http://s3.51cto.com/wyfs02/M00/47/EE/wKioL1QEE_KyROHNAADo-tLj_Y8625.jpg" target="_blank"></a>
Master端會檢索給被管理的節點定義好的類,然後到子產品中把需要執行的類給抽取出來編譯成catalog發送給agent,agent再到本地應用一遍。
資源組成類,類封裝起來形成子產品。
資源定義(resource declaration)
Resources are the fundamental unit formodeling system configurations 資源是系統子產品配置的基礎機關。
常用的資源類型:
group, user
package
file
service
notify
yumrepo
exec
cron
mount
puppet describe–list 列出所有資源類型;
puppet describe -s<TYPE>:列出指定資源的簡要說明;
puppet describe<TYPE>:顯示指定資源的詳細說明;
文法(synax)
Every resource has a type ,a title and a set of attributes.每一個資源有一個類型,一個标題和一些屬性。
type { 'title':
Attribute => value,
}
我們來根據上面文法定義一個簡單的資源,建立一個notify.pp檔案,寫入以下内容,然後儲存。
notify {'notice':
message => 'hello world',
}
可以使用 puppet apply 指令執行清單檔案。
<a href="http://s3.51cto.com/wyfs02/M01/47/EC/wKiom1QEFMfBG6VnAADln-ZIehg973.jpg" target="_blank"></a>
定義一個資源,安裝httpd程式。vim test2.pp
package {'httpd':
ensure => 'installed',
}
<a href="http://s3.51cto.com/wyfs02/M01/47/EE/wKioL1QEFkmhc8j2AAFKGsOHYDo328.jpg" target="_blank"></a>
如果我們還需要它啟動起來,則再定義一個service資源,繼續修改test2.pp。
service {'httpd':
ensure => 'running',
<a href="http://s3.51cto.com/wyfs02/M01/47/EE/wKioL1QEFoOQUQahAAE98TWf9jg047.jpg" target="_blank"></a>
資源引用:
類型['資源名稱']
引用時,類型的首字母要大寫;
before:目前資源先執行完成以後,再執行before的資源。
require:需要的資源執行以後,目前資源才能執行。
Example(一):
ensure=> 'installed',
before=> Service['httpd'],
ensure=> 'running',
說明:這表示目前資源執行完成以後,才能運作Service['httpd']資源。也就是必須先安裝了httpd才能啟動httpd。
Example(二):
ensure => 'installed',
}
ensure => 'running',
require => Package[httpd],
說明:需要Package[httpd]資源執行完成後,才能運作目前資源。兩個例子達到的效果相同,但是表訴方法可以不同。
定義資源建立使用者組。
user { 'tuchao':
ensure => present,
uid => '600',
gid => '600',
home => '/home/tuchao',
shell => "/bin/bash",
managehome => true,
password => '$1$6a2222e7$LyK7xelqGU.QwUDOX44oW.',
require => Group['tuchao'],
}
group {'tuchao':
gid => 600,
}
<a href="http://s3.51cto.com/wyfs02/M01/47/EC/wKiom1QEFkCCApPGAAEeVJREicM904.jpg" target="_blank"></a>
定義file資源,實作檔案替換。
file{'/etc/httpd/conf/httpd.conf': //定義的檔案路徑,在資源屬性中,是以标記為namevar,預設值為title。
ensure => file, //定義為普通檔案
source =>'/backup/httpd/httpd.conf', //源檔案路徑
mode => '0644', //權限
owner => 'root',
group => 'tuchao',
<a href="http://s3.51cto.com/wyfs02/M02/47/EE/wKioL1QEF5eiXK6EAAFGjfqqbbA419.jpg" target="_blank"></a>
定義指令資源exec用于啟動httpd服務。
exec {'command1':
path =>'/bin:/sbin:/usr/bin:/usr/sbin',
command => 'service httpd start ',
user => root,
group => root,
<a href="http://s3.51cto.com/wyfs02/M01/47/EC/wKiom1QEFs3wUui5AADf64CK_3o436.jpg" target="_blank"></a>
資源相關性,一般用于當配置檔案修改,需要通知服務重新開機的場景。
Notify(通知):定義在前資源中,當資源執行時可以通知某個資源。
Subscribe(訂閱),定義在後資源中,當訂閱的某個資源執行時,重新開機目前服務資源。
file{'/etc/httpd/conf/httpd.conf':
ensure => file,
source =>'/backup/httpd/httpd.conf',
mode => '0644',
notify => Service['httpd'],
ensure => running,
# subscribe =>File['/etc/httpd/conf/httpd.conf'],
資源間的應用次序鍊
“—>”用于定義次序鍊,而”~>”用于定義通知鍊,它們既可以用于資源引用間,也可以用于資源申報之間。
Package[‘ntp’] —> File[‘/etc/ntp.conf’] ~> Service[‘ntpd’]
<a href="http://s3.51cto.com/wyfs02/M01/47/EC/wKiom1QEF0PAXyiwAAER_B8WH5U023.jpg" target="_blank"></a>
Puppet 變量:
1、使用$開頭,無論是定義還是引用:
2、變量有其作用域,不在同一個作用域需要用FQN(長格式完全限定名稱)引用。
facter -p //用于顯示puppet頂級作用域所有變量。
Puppet 需要注意的資料類型:
Undef 從未被聲明的變量的值類型
$abc=’hello world’ //聲明變量指派
$abc=undef //撤銷變量
hash
即為外鍵值資料類型,鍵和值之間使用”=>”分隔,鍵值對兒定義在”{}”中,彼此間以逗号分隔;
其鍵為字元型資料,而值可以為puppet支援的任意資料類型;
通路hash類型的資料元素要使用”鍵”當作索引進行;
正規表達式
使用格式:(?選項:模式)
Example:
/(?i-mx:Redhat|Centos)/
選項i(忽略字元大小寫),但不使用m(把.當作換行符)和x(忽略模式中的空白字元和注釋)。
寫一個執行個體,判斷作業系統類型,選擇安裝Web伺服器的程式包,使用notify輸出到螢幕。
$a =$operatingsystem ? {
/(?i-mx:^(redhat|centos))/ => 'httpd',
/(?i-mx:^(debian|ubuntu))/ => 'apache2',
}
message => "Install $a",
<a href="http://s3.51cto.com/wyfs02/M02/47/EE/wKioL1QEGVyiRJj1AADmtIZ_eWw447.jpg" target="_blank"></a>
條件判斷
條件裡面可以是表達式、變量、多個表達式做邏輯運算and,or,not、有傳回值的函數。
Example:
$tuchao=20
if $tuchao > 30{
notice ('Old man')
}
else {
notice ('young man')
判斷目前作業系統,選擇安裝合适的web程式包。
if $operatingsystem =~ /(?i-mx:^(Redhat|Centos))/ {
$webserver='httpd'
elsif $operatingsystem =~ /(?i-mx:^(debain|ubuntu))/ {
$webserver='apache2'
else {
notice ('Unknow OS')
package{"$webserver":
ensure => installed,
case 語句:
case $operatingsystem {
'Solaris': { notice ("Welcome to Solaris")}
'RedHat','Centos': { notice("Welcome to Redhat OSFamily")}
/(?i-mx:^(Debian|Ubuntu))/: { notice("Welcome to $1 linux")}
default: { notice ("Unknow OS")}
Selector
selector隻能用于期望出現直接值的地方,這包括變量指派、資源屬性、函數參數、資源标題、其他selector的值及表達式
但是不能用于一個已經嵌套于selector的case中,也不能用于一個已經嵌套于case的case語句中。
使用要點:
1、整個selector語句會被當作一個單獨的值。
2、如果沒有任何一個case與控制變量比對時,puppet在編譯時将會傳回一個錯誤,是以,實踐中,其必須提供default case。
3、Selector的控制變量隻能是變量或有傳回值的函數,不能使用表達式。
4、其各case可以是直接值(需要加引号)、變量、能調用傳回值的函數,正規表達式模式或default。
5、與case語句不同的是,selector的各case不能使用清單。
6、Selector的各case的值可以是一個除了hash以為的直接值、變量、能調用傳回值的函數或其它的selector。
本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1547469