Linux基礎(chǔ)教程之Puppet 的使用與進(jìn)階
Puppet
基于puppet 可實(shí)現(xiàn)自動(dòng)化重復(fù)任務(wù), 快速部署關(guān)鍵性應(yīng)用以及在本地或云端完成主動(dòng)管理變更和快速擴(kuò)展架構(gòu)規(guī)模.
基于master/agent 模型. 基于RPC 的通信, 基于xml 進(jìn)行數(shù)據(jù)交換
define : 使用puppet 語言來定義資源的狀態(tài)
模擬 : 根據(jù)資源關(guān)系圖, puppet 可以模擬部署無損運(yùn)行測試代碼
強(qiáng)制 : 對(duì)比客戶端主機(jī)狀態(tài)和定義的資源狀態(tài)是否一致, 自動(dòng)強(qiáng)制執(zhí)行
report : 通過puppt API 可以將日志發(fā)送到第三方監(jiān)控工具
puppet 工作模型 :
- 單機(jī)模型 : 手動(dòng)應(yīng)用清單
- master / agent : 基于RPC 的通信, 基于xml 進(jìn)行數(shù)據(jù)交換
puppet 常用資源類型
資源抽象的維度, RAL 如何抽象資源的
三個(gè)層次 ?: 資源抽象層, 事物層, 配置語言層
類型 : 具有類似屬性的組件, 例如 package, service, file
將資源的屬性或狀態(tài)與其實(shí)現(xiàn)方式分離
僅描述資源的目標(biāo)狀態(tài), 也即實(shí)現(xiàn)的結(jié)果狀態(tài), 而不是具體過程
RAL 由 “類型” 和”提供者” (“provider”) 共同實(shí)現(xiàn)
puppet 子命令 :
help :
顯示幫助
1 | puppet help <command> |
1 | puppet help <command> <action> |
apply :
手動(dòng)控制如何應(yīng)用清單
`puppet apply [-d | —debug] [-v | —verbose] [-e | —execute] [ —noop ]
describe :
顯示資源類型的幫助信息
1 2 3 4 |
-l : 列出所有的資源類型 -s : 顯示指定類型的簡要幫助信息 puppet describe -s Command -m : 顯示指定類型的元參數(shù), 一般與-s 一同使用 |
資源定義 ?: 向資源類型的屬性賦值來實(shí)現(xiàn), 可稱為資源類型的實(shí)例化
資源定義所在的文件即為資源清單 manifest
定義資源的語法 :
1 2 3 4 |
type {“title”: attribute => value1, attribute2 => value2, } |
注意 ; type 必須使用小寫字母, title 是一個(gè)字符串, 在同一類型中必須唯一
status :
顯示server 的狀態(tài)
agent :
運(yùn)行客戶端程序
master :
作為服務(wù)器主機(jī), 用于控制其他的客戶端和本機(jī)
module :
官方支持的模塊
資源類型
- group :
創(chuàng)建和管理組
name : 組名
gid : 組ID
ensure : 狀態(tài)[present ?| absent]
system : 是否為用戶組 [true | false]
members : 成員用戶 - user :
管理用戶
name : 用戶名
uid : UID
gid : 基于組ID
groups : 附加組
comment : 注釋
expiry : 過期時(shí)間
home : 家目錄
shell : 默認(rèn)shell 類型
system : 是否為系統(tǒng)用戶
ensure : present | absent
password : 加密后的密碼串 - package :
管理軟件包
name : 軟件包名
ensure : [ installed | present | absent]
source : 程序包來源 [rpm | yum] - service
服務(wù)管理
ensure : [ installed | present | latest | ]
path : 啟動(dòng)服務(wù)的腳本
name : 服務(wù)名稱
enable : 是否開機(jī)啟動(dòng)
restart : 通常用于重定義為 reload
hasrestart : 有重啟命令 [true | false]
hasstatus : 有狀態(tài)查詢命令 - file :
管理文件
ensure : 文件類型的確認(rèn) [file | directory | link | present | absent ]
path : 文件路徑
source : 源文件
content : 文件內(nèi)容
target : 符號(hào)連接的目標(biāo)文件
owner : 屬主
group : 屬組
mode : 權(quán)限
atime/ctime/mtime : 時(shí)間戳
- exec :
執(zhí)行命令
cwd : ?命令執(zhí)行的目錄
command : 要運(yùn)行的程序
creates : 文件路徑不存在即創(chuàng)建
user/group : 運(yùn)行命令的用戶身份
onlyif : 此屬性指定一個(gè)命令, 此命令正常(退出碼為0)運(yùn)行時(shí), 當(dāng)前command 才會(huì)運(yùn)行
unless : 此屬性指定一個(gè)命令, 此命令非正常(退出碼為0)運(yùn)行時(shí), 當(dāng)前command 才會(huì)運(yùn)行
refresh : 重新執(zhí)行當(dāng)前command 的替代命令
refreshonly : 僅接收到訂閱資源的通知時(shí)方才運(yùn)行 - cron :
設(shè)置定時(shí)任務(wù)
command:要執(zhí)行的任務(wù);
ensure:present/absent;
hour:
minute:
monthday:
month:
weekday:
user:添加在哪個(gè)用戶之上;
name:cron job的名稱;1
2
3
4
5
6cron{“timesync”:
command => “/usr/sbin/ntpdate 10.1.0.1 &> /dev/null”,
ensure ?=> present,
minute ?=> “*/3”,
user ? ?=> “root”,
} - notify :
在日志中追加記錄信息
message : 信息內(nèi)容
name : 信息名稱1
2
3
4notify {“hello”
message ?=> ‘hello guys’
name => ‘hello message’
}
資源引用 :
Type[‘title’]
類型的首字母必須大寫
資源有特殊屬性 :
- 名稱變量 : (namevar) : name 可省略, 此時(shí)將由title表示
- ensure : 定義資源的目標(biāo)狀態(tài)
- 元參數(shù) : metaparameter :
- 依賴關(guān)系 : before | require
- 通知關(guān)系 : 通知相關(guān)其他資源進(jìn)行刷新操作 notify | subscribe
補(bǔ)充 : before 是表明必須在某個(gè)操作之前進(jìn)行, require 是要求在某個(gè)操作執(zhí)行完后進(jìn)行
定義的時(shí)候, 只需要在意的是目標(biāo)的狀態(tài), 不需要在乎目標(biāo)的過程
變量
數(shù)據(jù)類型 :
字符型:引號(hào)可有可無;但單引號(hào)為強(qiáng)引用,雙引號(hào)為弱引用;
數(shù)值型:默認(rèn)均識(shí)別為字符串,僅在數(shù)值上下文才以數(shù)值對(duì)待;
數(shù)組:[]中以逗號(hào)分隔元素列表;
布爾型值:true, false;
hash:{}中以逗號(hào)分隔k/v數(shù)據(jù)列表; 鍵為字符型,值為任意puppet支持的類型;{ ‘mon’ => ‘Monday’, ‘tue’ => ‘Tuesday’, };
undef:未賦值型 ;
正則表達(dá)式:
(?[ENABLED OPTION]:[PATTERN])
(?-[DISABLED OPTION]:[PATTERN])
OPTIONS:
i:忽略字符大小寫;
m:把 ‘.’ 當(dāng)換行符;
x:忽略[PATTERN]中的空白字符
變量類型:
- facts:agent向master 傳遞信息之前收集的信息
由facter提供;top scope;將主機(jī)信息收集并規(guī)范化 - 內(nèi)建變量:
master端變量 $servername, $serverip, $serverversion
agent端變量 $environment, $clientcert(客戶端證書), $clientversion
parser變量 $module_name(當(dāng)前應(yīng)用的模塊名稱) - 用戶自定義變量:
$parameter_value
變量的作用范圍
作用域 : top scope | node scope | class scope
任何給定的scope 都可以訪問它自己的內(nèi)容, 以及接收來自于其父scope, 節(jié)點(diǎn)scope 以及top scope 的內(nèi)容
如果要訪問非當(dāng)前scope中的變量, 則需要通過完全限制名稱進(jìn)行, 如 $vhostdir = $apache::params::vhostdir
需要注意的是, top scope 的名稱為空, 因此, 如若引用其變量, 則需要使用類似$::osfamily 進(jìn)行
自己作用域的變量是不需要使用完全限制名稱解析進(jìn)行訪問
操作符
=~ : 左側(cè)的字符串能夠被右側(cè)的字符所匹配
!~ : 左側(cè)的字符串不能被右側(cè)的字符所匹配
in : 左側(cè)的字符串在右側(cè)的列表中能被匹配到
Puppet 中的if 語句
條件判斷, 其中CONDITION 可以有各宗
1 2 3 4 5 6 7 8 9 |
if CONDITIONS { … } elsif CONDITIONS{ … } else { … } |
示例 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if $osfamily =~ /(?i-mx:debian)/ { $webserver = “apache2” } else { $webserver = “httpd” } package{‘$webserver’: ensure ?=> installed, before ?=> [ File[“httpd.conf”], Service[“httpd”] ], } file{“httpd.conf”: path ? ?=> “/etc/httpd/conf/httpd.conf”, source ?=> “/root/manifests/httpd.conf”, ensure ?=> file, } |
Puppet 中的case 語句
使用方法:
1 2 3 4 5 6 7 |
case CONTROL_EXPRESSION { case1: { … } case2: { … } case3: { … } … default: { … } } |
CONTROL_EXPRESSION:
- 變量
- 表達(dá)式
- 有返回值的函數(shù)
各case的給定方式:
- 直接字串;
- 變量
- 有返回值的函數(shù)
- 正則表達(dá)式模式;
- default
注意:不能使用列表格式;但可以是其它的selecor;
示例 :
1 2 3 4 5 |
$webserver = $osfamily ? { ‘Redhat’ => “httpd”, /(?i-mx:debian)/ => “apache2”, default => “httpd”, } |
Puppet 的類
類 : puppet 中命名的代碼模塊, 常用于定義一組通用目標(biāo)的資源, 可在puppet 全局調(diào)用, 類可以被繼承, 也可以包含子類
1 2 3 4 5 6 |
class NAME { …puppet code… } class NAME(parameter1, parameter2) { …puppet code… } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class nginx { package{“nginx”: ensure ?=> installed, }service{“nginx”: ensure ?=> running, enable ?=> true, require => Package[“nginx”], } } class nginx::web inherits nginx { file{“nginx.conf”: Service[“nginx”] { |
Puppet 的模塊
模塊就是一個(gè)按約定的, 預(yù)定義的結(jié)構(gòu)存放了多個(gè)文件或子目錄的目錄, 目錄里的這些文件遵循一定格式的命名規(guī)范
puppet 會(huì)在配置的路徑下查找所需要的模塊
1 2 3 4 5 6 7 8 |
MODULES_NAME: |-manifests/ | ? |_init.pp |-files/ |-lib/ |-templates/ |-spec/ |_tests/ |
模塊名只能以小寫字母開頭,可以包含小寫字母、數(shù)字和下劃線;但不能使用”main”和”settings“;
1 2 3 4 5 6 7 8 9 10 |
manifests/ init.pp:必須一個(gè)類定義,類名稱必須與模塊名稱相同; files/:靜態(tài)文件; puppet URL: puppet:///modules/MODULE_NAME/FILE_NAME templates/: tempate(“MOD_NAME/TEMPLATE_FILE_NAME”) lib/:插件目錄,常用于存儲(chǔ)自定義的facts以及自定義類型; spec/:類似于tests目錄,存儲(chǔ)lib/目錄下插件的使用幫助和范例; tests/:當(dāng)前模塊的使用幫助或使用范例文件; |
mariadb模塊中的清單文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class mariadb($datadir=”/var/lib/mysql”) { package{“mariadb-server”: ensure ?=> installed, }file{‘$datadir’: ensure ?=> directory, owner ? => mysql, group ? => mysql, require => [ Package[“mariadb-server”], Exec[“createdir”], ], } exec{“createdir”: file{“my.cnf”: service{“mariadb”: |