複製鏈接
請複製以下鏈接發送給好友

puppet

(集中配置管理系統)

鎖定
puppet是一種Linux、Unix、windows平台的集中配置管理系統,使用自有的puppet描述語言,可管理配置文件、用户、cron任務、軟件包、系統服務等。puppet把這些系統實體稱之為資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。
puppet採用C/S星狀的結構,所有的客户端和一個或幾個服務器交互。每個客户端週期的(默認半個小時)向服務器發送請求,獲得其最新的配置信息,保證和該配置信息同步。每個puppet客户端每半小時(可以設置)連接一次服務器端, 下載最新的配置文件,並且嚴格按照配置文件來配置客户端. 配置完成以後,puppet客户端可以反饋給服務器端一個消息. 如果出錯,也會給服務器端反饋一個消息.
外文名
puppet
性    質
集中配置管理系統
特    點
使用自有的puppet描述語言
設計目標
簡化對這些資源的管理

puppet開發原因

系統管理員都喜歡自己寫點小工具來讓自己的工作完成的更快或者更好, 不管是在大企業管理大量的服務器還是隻管理兩三台機器. 但是很少人會把他們的工具發佈出來. 也就是是説極少有工具能被重用,或者説很多工具就只能在所在的組織內部有用.拷貝給別的組織,他們也用不上. 也就是説,每個系統管理員,在一個新的公司,都會另起爐灶開發一套基於ssh,for循環的"系統"來幫助自己完成系統管理任務.
開發puppet是為了讓系統管理員可以相互交流和共享成熟的工具,避免重複的勞動.通過以下兩個特性來實現這一目標:
提供一個簡潔的但是強大的框架來完成系統管理任務
系統管理任務可以描述成puppet語言,因此可以相互分享代碼,就像分享其他語言的代碼一樣,比如python, c等
因此,作為系統管理員的你可以更快的完成工作,因為你可以用puppet來處理所有的管理細節. 甚至你還可以下載其他管理員的puppet代碼來讓你的工作完成的更快.

puppet使用的穩定性

puppet與其他手工操作工具有一個最大的區別就是 puppet的配置具有穩定性,因此你可以多次執行puppet, 一旦你更新了你的配置文件,puppet就會根據配置文件來更改你的機器配置,通常每30分鐘檢查一次. puppet會讓你的系統狀態同配置文件所要求的狀態保持一致. 比如你配置文件裏面要求ssh服務必須開啓. 假如不小心ssh服務被關閉了,那麼下一次執行puppet的時候,puppet會發現這個異常,然後會開啓 ssh 服務. 以使系統狀態和配置文件保持一致.puppet就象一個魔術師,會讓你的混亂的系統收斂到puppet配置文件所想要的狀態.
可以使用puppet管理服務器的整個生命週期,從初始化到退役.不同於傳統的例如sun的Jumpstart或者redhat的Kickstart, puppet可以長年讓服務器保持最新狀態.只要一開始就正確的配置他們,然後再也不用去管他們.通常puppet用户只需要給機器安裝好puppet並讓他們運行,然後剩餘的工作都由puppet來完成.

puppet細節和原理

puppet的目的是讓你只集中於你要管理的目標,而忽略實現的細節,例如命令名,參數或者文件格式. puppet把系統裏面的用户,軟件包,服務 看作是"資源", puppet的作用就是管理這些資源以及資源之間的相互聯繫.
底層支撐工具 Providers,puppet有很多的資源類型,例如文件,用户,軟件包,服務, 不同的操作系統上對資源的管理命令是不一樣的,例如debian下面用apt-get安裝軟件,redhat下面用yum安裝軟件. 因此puppet 對同一資源的管理可以有多個實現,配置資源的時候,可以明確的指定用什麼provider. 例如在redhat上配置一個package資源的時候,可以指定provider是yum.

puppetFacter變量

在puppet客户端分析代碼的時候,會把從facter傳送過來的對應的值賦值給變量. 你可以單獨手工執行facter這個命令,這個命令會打印出它所收集到的關於主機的信息,例如ip地址等等. facter把收集到值發送給puppet服務器端,服務器端就可以根據不同的條件來對不同的節點機器生成不同的puppet配置文件. 最重要的一個就是服務器的主機名.

puppet工作方式流程

puppet既可以在單機上使用,也可以以c/s結構使用.在大規模使用puppet的情況下,通常使用c/s結構.在這種結構中puppet客户端只是指運行puppet的客户端,puppet服務器端是隻運行puppetmaster的服務器.
puppet客户端首先會連接到puppet服務器端,並且通過facter工具把客户端的基本配置信息發送給服務器端. 服務器端通過分析客户端的主機名,通過node 定義,找到該主機的配置代碼,然後編譯配置代碼,把編譯好的配置代碼發回客户端,客户端執行代碼完成配置.並且把代碼執行情況反饋給puppet服務器端.

puppet修改系統配置

puppet 通過管理資源的方式來管理系統, 例如管理某個軟件是否要安裝,是安裝最新的還是安裝了就行. 管理某個服務是否開啓, 管理某個文件的屬性,內容等等. 所有的資源都有對應的幾個屬性可以設置. 通過設置屬性的方式來管理資源. 有一種特殊的屬性可以用在所有的資源上面,這種屬性叫做 metaparams ( 元參數或者元屬性).

puppet資源之間關係

支持資源之間的關係配置是puppet的關鍵特性之一. 一個資源的變更可以對另一個資源產生一個動作.例如 /etc/apache.conf這個資源有改動,可以讓/etc/init.d/apache 這個資源 reload一下.假如一個資源依賴另一個資源,那麼puppet會優先配置被依賴的資源,因此如果你的配置文件沒有準備好,對應的服務是不會先啓動的.

puppet語言資源

puppet的全部就是管理資源,因此puppet語言的焦點就是處理這些資源,下面是一個基本的管理單個資源的例子.
file {"/etc/hosts": owner = root, group = root, mode = 644}
上面的例子給出了定義一個資源所需要的所有組件,類型,名字和屬性. 定義了一個 file 資源, 資源的title(標題)是 "/etc/hosts", 資源的屬性裏面設置了該文件屬於哪個用户和組,以及文件的權限.
也可以在一個大括號裏面定義多個資源,通過分號來區分.
避免重複配置
puppet的編譯器會避免在不同的代碼段裏面管理同一個資源, 如果在不同的代碼段對同一個資源進行配置,執行puppet的時候你會得到一個語法錯誤.puppet探測這種衝突的情況是通過判斷資源類型和資源的title(標題); 如果兩個資源有相同的資源類型和title; 那麼就認為這兩個資源是表示同一個資源.

puppet

你可以把多個相關的資源定義在一起,組成一個類.可以在其他的代碼段include這個類.puppet還支持有限制的類的繼承,作用就是在子類裏面的屬性可以覆蓋父類裏面的屬性.

puppet字符串

幾乎所有的東西和符號在puppet裏面都被看作是字符串,包括數字和布爾值. 但是如果你用引號把true和false引起來,他們會被當做字符串,例如你想賦值給某個資性"yes"的 字符串.

puppet變量

puppet除facter變量外,也可以自定義變量,但不允許你在同一個類裏面對一個變量進行兩次賦值.
$myvar = value123

puppet條件語句

Puppet支持常見的條件語句,使得你能根據不同的條件導入不同的資源定義。如if、case、另外puppet從版本0.24.6開始支持比較運算符

puppet數組

puppet 非常有限的支持數組這種類型,你可以創建數組,並且給他們賦值,但是你不能刪除它們.數組用的最多的情況就是上面ssh例子裏面,資源依賴哪種情況. 或者是一次管理多個相同類型的資源.例如:user { [bin, adm]: ensure => present }

puppet函數

puppet提供一些有用的函數,例如template利用erb模板來生成文件內容,這樣就可以根據不同主機的情況,生成不同的配置文件.例如配置squid的內存緩存大小,可以利用facter返回的內存值做一個簡單的數學計算,然後寫入到squid的配置文件,就是通過template來完成的. 另外一個函數include 可以讀入另外的puppet配置文件或者類.這樣可以把puppet的文件分割的更有規律.

puppet節點

最後一個關於puppet語言的語法是節點定義"node", 節點定義很象類定義,也支持繼承特性. 當一個節點(puppet客户端)連接到puppet服務器端,puppet解析器會查找這個節點的node代碼片斷,然後利用這個代碼片斷來生成該客户端的配置代碼. puppet裏面主機名來標明一個主機,因此主機名在puppet裏面相當重要. 如果puppet找不到匹配該主機名的node定義,就會用默認的節點定義來配置該主機. 在node裏面使用主機名,需要用單引號把主機名括起來.
node 'server1' { include nginx }
在上面的代碼中,如果server1這個主機連接到puppet服務器,puppet服務器就會按照nginx的代碼來配置這台服務器.

puppet自定義資源

puppet裏面有一個非常有用的語法結構,叫做define, 通過define可以把多個資源包裝成一個資源,或者把一個資源包裝成一個模型,便於使用.例如,在debian裏面管理一個apache虛擬機非常簡單,把一個虛擬主機的配置文件放到/etc/sites-available/裏面,然後做一個符號鏈接到/etc/sites-enabled目錄. 你可以為你每個虛擬主機複製同樣的配置代碼.

puppet版本

puppet 有企業版和社區版,版本是2.6。
社區版是免費的,有些常用的功能。
企業版是收費的,支持vmware虛擬機的部署和審計功能。但如果10個節點以下是免費的。
2013年1月13日。