Puppet是集中配置管理系統,可以說使我們Ansible的升級版,當我們的服務器集羣過於大時,Ansible就可能力不從心了,我們知道Ansible是基於ssh的連接,而我們的Puppet則是通過https xmlrpc鏈接,安全係數明顯上了一個層次。
Puppet的工作模式,是通過對Puppetmasterd進行更改,client每隔半個小時取一次數據,不管對數據的處理成功與否,都要返回一個報告,通知到master,Puppet有兩種工作模型,一種是單機模型,一種是master/agent模型,看名字都知道一種是在本地自己玩自己的,一種是管理從的,我們今天就先來玩一下單機模型。
單機模型甚至都不用開啓Puppet服務,直接可以使用命令,當然了命令的格式很長,但是Puppet提供很好的幫助文檔來幫助我們對該命令的使用,我們可以使用Puppet help查看具體語法和相關選項。
語法:puppet <subcommand> [options] <action> [options]
<subcommand>中有幾個是我們常用的選項,比如:
apply:本地使用puppet,也就是單機模型的必需選項
agent:我們下章的master/agent模型使用的必需選項
cert:Puppet的證書相關,既然使用的https xmlrpc來通信,自帶了CA和cert
describe:這個選項特別重要,資源,是我們在進行控制時可以使用的類似Ansible的一些模塊,我們可以使用puppet describe --help來查看都支持哪些資源
device:網絡設備遠程管理
doc:文檔相關
facts:系統變量相關,Puppet還可以調用系統變量,不過不管是定義還是調用,都要使用$
一般來說,我們接觸過Ansible之後,再來瞅Puppet,會簡單的多,我們Puppet也是編寫一些類似劇本一樣的資源清單,來調用資源進行管理,那麼我們可用的資源都有什麼呢?
我們使用puppet describe --list查看所有的清單列表,我們介紹幾種常用的:
cron:計劃任務相關的,類似於Ansible的cron模塊
exec:執行外部命令
file:文件相關
group:用戶組相關
host:主機相關
mount:掛載相關
notify:通知機制
package:安裝包相關,類似於Ansible的yum,不過package可以指定以什麼方式安裝
service:服務相關的
yumrepo:yum倉庫先關
...
有很多的資源,我們什麼時候用,什麼時候查,不過死記硬背,當然我們知道了資源名,怎麼用啊,我具體分爲三步:
1 puppet describe --list:查看都有什麼資源
2 puppet describe file -m -s:查看file的簡短的providers和元參數,使用這個查出選項
3 puppet describe file -p:查看file的一些providers,使用這個看選項參數
舉個例子,我們想安裝一個nginx服務,安裝後啓動,開機自啓動。
首先我們先要定義一個以.pp結尾的文件,puppet的資源清單就是這麼定義的,比如爲install.pp,內容如下:
package{'nginx':
name => "nginx", #name指定安裝包爲nginx
ensure => installed, #安裝方式爲默認yum安裝
}service{'nginx':
ensure => running, #服務名稱爲nginx的啓動
enable => true, #開機啓動爲true
}
有個可能看出來了,這個格式是怎麼回事?爲什麼有的有name,有的沒有name,service沒有name會不會不知道啓動哪個服務,你這些參數怎麼查到的?
首先格式:
type {'title':
attribute1 => value1,
atrribute2 => value2,
……
}
注意:type必須使用小寫字符;title是一個字符串,在同一類型中必須惟一,資源清單一般以.pp結尾;
其次是name沒有定義的問題,資源屬性中有一個爲namever的屬性,當你不定義時,會自動引用title的名稱爲name。
最後是關於這些資源的查詢與用法,比如我們先用的是package,所以我們可以這樣查詢,puppet describe package -m -s,查看簡短的介紹
屬性是可以了,那麼怎麼用呢?有什麼選項呢?我們可以使用puppet describe package -p查看具體屬性怎麼用,那麼既然package可以查的到那我們的service也是妥妥的可以使用了。
我們配置好之後,可以使用puppet apply -v --noop install.pp來試運行一下,如果沒有報錯,去掉--noop再運行,可以提高正確率哦,其中有些常用選項,我來和大家介紹一下:
-v:詳細輸出
-d:debug模式,輸出極爲詳細
--noop:調試模式,試運行,可以提前排錯
-l PATH:輸出結果到指定文件中
資源間有的還存在一些依賴關係,比如我們直接啓動服務,而服務沒有安裝完成怎麼辦?所以資源間的次序可以使用一些屬性before、require、notify和subscribe來定義,我們有多種方法,定義這種依賴關係:
1 在package下加入一行before => Service['nginx']
2 在service下加入一行require => Package['nginx'],
3 package的}後面加入->也可以實現一依賴關係
4 在所以資源定義的下面,自己一行 Package['nginx'] -> Service['nginx']