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