功能豐富的Perl:用于系統管理

cfengine(配置引擎)是一種 UNIX 管理工具,其目的是使簡單的管理的任務自動化,使困難的任務變得較容易。它的目標是使系統從任何狀態收斂(convergence)到一種理想狀態。依照它的作者 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。

在開始使用 cfengine 之前,應該編譯和安裝它。對于可以使用它們的系統,RPM 都有可用的版本, 而且還有一個可用的 Solaris 包(請參閱參考資料)。如果要存儲文件的永久校驗和(類似于 Tripwire 所做的事情),則應該帶有 Berkeley DB 支持進行編譯。然後,應該開始創建配置文件。 主要的配置文件是 /etc/cfengine/cfengine.conf,它是在不帶文件名調用 cfengine 時運行的(當在 1.6.3 中編譯時,可以指定一個不同的缺省配置目錄,但在 2.0 及更高版本中,/etc/cfengine 將是檢查的唯一位置,所以您應該嚴格遵守這一點)。

下面是 cfengine 的啓始配置。它不是成品, 在運行它之前,應該仔細地閱讀 cfengine 參考大全和教程(請參閱參考資料)。 請帶 -v -n(詳細的預演)選項嘗試運行 cfengine,看一下這個配置將做些什麽。 當使用 -n(預演)選項時,不會影響系統。

清單 1. cfengine 的啓始配置文件 /etc/cfengine/cfengine.conf

# note that only some of the possible sections are used here;

# refer to the cfengine documentation for the full list of sections

# you can have.

Comments, as you can see, are like shell or Perl

# comments.

# see the tutorial and reference for any unexplained phenomena

import:

any::

cf.groups

groups:

# all groups are defined in cf.groups, imported above, but you can

# define extras here.

The format is simple:

class = ( machine1 machine2 )

# and then any machine named machine1 or machine2 will have that class

# defined.

# the control section sets up how cfengine will behave

control:

any::

# you have to state in AddInstallable what classes unknown to cfengine

# by default you will be using.

Run cfengine as "cfengine -v" to see

# the built-in classes you don't have to define.

Here we divide

# machines into the ones that run inetd and the ones that run xinetd,

# as an example.

AddInstallable = ( inetd xinetd )

editfilesize

= ( 300000 )

moduledirectory = ( /etc/cfengine/modules )

domain

= ( yourdomain.com )

any::

LogDirectory

= ( /etc/cfengine/log )

netmask

= ( 255.255.255.0 )

Repository

= ( /etc/cfengine/repository )

sysadm

= ( "tzz@iglou.com" )

# Bug in cfengine: actionsequence must follow LogDirectory and Repository

actionsequence = ( directories files editfiles copy links processes disable

shellcommands )

directories:

# this ensures that these directories will be created when cfengine runs

/etc/cfengine/log

/etc/cfengine/repository

/etc/cfengine/cfcollector

files:

any::

# set the permissions for these files

/etc/sudoers mode=0440 owner=root group=root action=fixall

/etc/hosts.allow mode=0644 owner=root group=root action=fixall

/etc/hosts.deny mode=0644 owner=root group=root action=fixall

# just warn if this file's permissions are wrong

/etc/shadow mode=0400 owner=root action=warnall inform=true

# CERT advisory CA-2001-05, for Solaris only

solaris::

/usr/lib/dmi/snmpXdmid mode=0000 owner=root group=root action=fixall

# example of setting permissions differently for different OS types

# (not Linux and Linux), and negating classes

!linux::

/.ssh mode=0700 owner=root action=fixall inform=true

linux::

/root/.ssh mode=0700 owner=root action=fixall inform=true

editfiles:

any::

# add the rsync service to /etc/services and /etc/inetd.conf

{ /etc/services

SetLine "rsync

873/tcp # rsync"

功能豐富的Perl:xinetd程序用于系統管理
  開始之前  爲實現本文的目的,您的系統最好安裝了最近的主流(2000 或更新)UNIX(Linux、Solaris、BSD)。這些示例在 Perl 和 UNIX(以及其它操作系統)的早期版本上也可以運行,但是它們功能方面的障礙應該由...查看完整版>>功能豐富的Perl:xinetd程序用于系統管理
 
功能豐富的Perl:Perl用于實現遺傳算法
  如果您的機器上已經安裝了 Perl 5.005 或者更高的版本,您可以運行一下文章中的例子。您的系統最好應該是安裝了最近的(2000 年或者更遲些)主流的 UNIX(Linux,Solaris,BSD),但其它種類的操作系統可能也可以...查看完整版>>功能豐富的Perl:Perl用于實現遺傳算法
 
功能豐富的Perl:輕松調試Perl的技巧
  錯誤所帶來的麻煩  軟件開發人員通常都低估了軟件測試的重要性。這一現象的根本原因很簡單:處理錯誤很困難!因爲錯誤往往暴露了代碼的根本缺陷,所以有時候開發人員甚至會爲了幾個錯誤而從頭開始重新編寫項目...查看完整版>>功能豐富的Perl:輕松調試Perl的技巧
 
功能豐富的Perl:Perl自動化系統管理
  UNIX 系統管理總是一個棘手的問題,運用正確的工具會使這個問題變得容易。在這一部分中,Teodor 提出了關于使用 Perl 來簡化和牢固系統管理的想法。在這種環境中,系統配置引擎 cfengine 是一個極其重要的工具。...查看完整版>>功能豐富的Perl:Perl自動化系統管理
 
功能豐富的Perl:JustAnotherPerlHacker
  JAPH:“Just another Perl hacker”  據我們所知,JAPH 格式是在二十世紀九十年代由 Randal Schwartz 推廣的(好幾處信息來源都同意這個說法)。今天,JAPH 到處可見,它們是由該流派的那些不知疲倦的藝術家們...查看完整版>>功能豐富的Perl:JustAnotherPerlHacker
 
功能豐富的Perl:用Perl讀寫Excel文件
  Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel  在 2000 年,Takanori Kawai 和 John McNamara 編寫出了 Spreadsheet::WriteExcel 和 Spreadsheet::ParseExcel 模塊並將它們張貼在 CPAN 上,這兩個模塊...查看完整版>>功能豐富的Perl:用Perl讀寫Excel文件
 
功能豐富的Perl:編寫說英語的Perl程序
  設計程序的用戶界面可能很困難而且耗時。Teodor Zlatanov 討論了如何使用 Parse::RecDescent 模塊來用簡單的英語創建用戶界面文法。他還展示了向程序添加功能或從程序除去功能時,更改文法是如何的方便。另外還與...查看完整版>>功能豐富的Perl:編寫說英語的Perl程序
 
功能豐富的Perl:有趣的Ion窗口管理器
  請關注 Ion 窗口管理器這個功能強大卻很簡單的程序,可以用它來管理應用程序在桌面上調用的窗口。Ion 並非華而不實,一旦習慣了它,您的工作效率將因此得到極大的提高,而且您會感到奇怪:爲什麽以前還使用過其他...查看完整版>>功能豐富的Perl:有趣的Ion窗口管理器
 
功能豐富的Perl
  本文將介紹系統管理的兩個不同層次。Unix Power Tools,Shelley Powers、Jerry Peek、Tim O'Reilly 和 Mike Loukides 著,采用一種簡單易讀的方式介紹了系統管理的基本知識,這對于系統管理人員來說是一本必讀書...查看完整版>>功能豐富的Perl
 
 
回到王朝網路移動版首頁