cfengine(配置引擎)是一種 UNIX 管理工具,其目的是使簡單的管理的任務自動化,使困難的任務變得較容易。它的目標是使系統從任何狀態收斂到一種理想狀態。依照它的作者 Mark Burgess 所說,cfengine 總是使您的系統更接近於您所定義的配置; 它決不會使系統變得更糟。在本文中,Ted 通過演示一些簡單的 cfengine 使用,使您熟悉這一獨特的系統管理工具。
初學者和中級系統管理員將從本文獲益最多;解說和示例假設您可以運用大部分初學者級別的系統管理概念。
要使用本文中的示例,您的系統應該是一個最近的(2000 或更新)主流 UNIX(Linux、Solaris、BSD)安裝。示例可以與早期版本的 Perl 和 UNIX 以及其它操作系統一起使用,如果它們不能工作,對您來說,可以把它當成練習來解決。
cfengine 正處於開發中。版本 1.6.3 是穩定的,它是本文的基礎。當前正在進行阿爾法測試的版本 2.0 的計劃包括重寫體系結構、添加許多很棒的新功能部件以及使語法基本上保持不變。要了解 cfengine 的所有功能以及版本 2.0 中的增強功能,請訪問 cfengine主頁(請參閱本文後面的 參考資料)。
cfengine 的要點
cfengine 將改變您的系統管理方法。您將運行一個命令並觀察系統將收斂到一種穩定狀態。我保證這看起來象在變魔術。在您喝茶的時候,cfengine 將編輯文件、運行命令並創建符號鏈接。
然而,cfengine 並不能代替您思考。在將配置文件放入產品之前,您仍需要編寫它並對它進行測試。 而另一方面,cfengine 所做的事情幾乎很少會造成損害。
cfengine 使系統收斂成為可能。但是,為什麼需要收斂呢? 我認為系統管理員首先需要保持內心寧靜,其余的事情都是次要的。穩定性、可靠性和可預測性是達到內心寧靜的方法。這看似過分簡單, 但詢問任何一名好的系統管理員,每次您都會得到這個答案。收斂可以幫助管理員達到穩定性、可靠性和可預測性。雖然它不是達到那些目標的唯一方法,但在我的經歷中它所帶來的痛苦最少。
穩定性可定義為防止無意的更改。當 cfengine 實現收斂時,它通過規則集做到這一點。良好設計的規則(請放心,cfengine 使良好的設計變得容易)只是使系統達到一種理想狀態(如在 cfengine 規則中定義的那樣理想)。例如,每次運行 cfengine 時,都可以重新創建關鍵的系統符號鏈接。或者,只要修改了本地副本,都可以從可信資源庫復制 init.d 啟動腳本。 如果 cfengine 沒有發覺進程在運行,那麼可以重新啟動它們。
可靠性是使機器幸免於問題的能力。網絡出故障或磁盤出故障是主要的可靠性考驗。您的系統能幸免於那些問題嗎?通過收斂到一種理想狀態,您可以期望系統處於或接近那一理想狀態。 雖然可靠性不單由 cfengine 完成,但收斂可使之更加容易。 因為穩定的系統不太可能受問題影響,所以穩定性也是可靠性的主要資產。 最後,cfengine 的收斂使獲得“空白”系統並使它達到期望的狀態成為可能, 並能夠對關鍵系統進行快速臨時替換。
這裡,有必要多講講 期望和理想的狀態。目前為止,我們假設僅有一種理想狀態,它就是那個期望的狀態。事實上,對於所有機器來說並沒有理想狀態。 機器按任務、位置、連通性、用戶、操作系統類型和版本等分類。每個系統管理員都用某些方法來對他的機器分類,通常根據上述各項以及更多項(我們稍後將詳細討論類)。雖然對於所有機器來說沒有一種理想狀態,但對於給定的機器類有一個要達到的理想狀態。 這是 cfengine 的設計目標。cfengine 使尋找理想狀態變得可行,並且易於收斂到該狀態。
可預測性是機器按照期望的那樣來運轉的能力。 收斂通過使系統變得穩定且可靠來達到可預測性。而且,一旦新機器收斂到一種理想狀態,就可以期望它象它所替換的舊機器那樣工作。當機器將很快收斂到一個已知狀態時,就可以很容易地估計添加系統或替換它們的調度成本。最後,為您系統編寫的軟件可以期望系統處於一種接近理想的狀態。然後,系統資源處於一種可預測的狀態,這樣,軟件就可以更多地集中在功能上,而更少地將每個系統作為懷有敵意的未知領域對待。
cfengine 的概述
Cfengine 由幾個程序組成。在版本 1.6.3 中,主程序叫作 cfengine 。cfengine 程序解釋文件中的規則集,並執行那些規則請求的操作。 嚴格來說,cfengine 程序只是 cfengine 語言的解釋器,並且任何 cfengine 程序都只是那個解釋器的腳本。
在版本 1.6.3 中,還有一個名為 cfd 的守護程序及其同伴 cfrun 。cfd 將在版本 2.0 得到加強,而在 1.6.3 版本中有許多未完善的地方。幸運的是, 不用 cfd,就可以完成我所需要的任務(用信號通知運行 cfengine 並遠程復制文件)。我寧願在 ssh 上通過顯式腳本啟動 cfengine。 它只比 cfd 少許慢一點,但更易於監控。當通過 cfd 啟動時,cfengine 發出的錯誤和遠程定義的類沒有可靠地顯示出來。 對於遠程文件復制,我發現 cfd 是不可靠的而且可能會危害安全性,所以我使用 rsync。cfengine 的作者 Mark Burgess 聲明 cfd 在版本 2.0 中將有很大改進,而 rsync 將不再是必需的,但在版本 2.0 推出之前,我建議避免 cfd。