puppet是一種Linux、unix、windows平臺的集中配置管理系統。puppet使用自有的puppet描述語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。puppet把這些系統實體稱之為資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關系。
puppet采用C/S星狀的結構。機器每個客戶端周期的向服務器發送請求,獲得其最新的配置信息,保證和該配置信息同步。每個puppet客戶端周期性連接服務器端,下載最新的配置文件,并且嚴格按照配置文件來配置客戶端。配置完成以后,puppet客戶端可以反饋給服務器端一個消息。如果出錯,也會給服務器端反饋一個消息。
puppet與其他手工操作工具最大的區別就是puppet的配置具有穩定性。一旦更新了系統的配置文件,puppet會根據系統的配置文件來更改機器配置,讓系統狀態同配置文件所要求的狀態保持一致。
開發原因
系統管理員都喜歡自己寫點小工具來讓自己的工作完成的更快或者更好,不管是在大企業管理大量的服務器還是只管理兩三臺機器.但是很少人會把他們的工具發布出來.也就是是說極少有工具能被重用,或者說很多工具就只能在所在的組織內部有用。拷貝給別的組織,他們也用不上.也就是說,每個系統管理員,在一個新的公司,都會另起爐灶開發一套基于ssh,for循環的"系統"來幫助自己完成系統管理任務.
開發puppet是為了讓系統管理員可以相互交流和共享成熟的工具,避免重復的勞動。通過以下兩個特性來實現這一目標:
提供一個簡潔的但是強大的框架來完成系統管理任務
系統管理任務可以描述成puppet語言,因此可以相互分享代碼,就像分享其他語言的代碼一樣,比如Python,c等
因此,作為系統管理員的你可以更快的完成工作,因為你可以用puppet來處理所有的管理細節.甚至你還可以下載其他管理員的puppet代碼來讓你的工作完成的更快.
使用的穩定性
puppet與其他手工操作工具有一個最大的區別就是puppet的配置具有穩定性,因此你可以多次執行puppet,一旦你更新了你的配置文件,puppet就會根據配置文件來更改你的機器配置,通常每30分鐘檢查一次.puppet會讓你的系統狀態同配置文件所要求的狀態保持一致.比如你配置文件里面要求ssh服務必須開啟.假如不小心ssh服務被關閉了,那么下一次執行puppet的時候,puppet會發現這個異常,然后會開啟ssh服務.以使系統狀態和配置文件保持一致.puppet就象一個魔術師,會讓你的混亂的系統收斂到puppet配置文件所想要的狀態.
可以使用puppet管理服務器的整個生命周期,從初始化到退役。不同于傳統的例如sun的Jumpstart或者Red Hat的Kickstart,puppet可以長年讓服務器保持最新狀態。只要一開始就正確的配置他們,然后再也不用去管他們。通常puppet用戶只需要給機器安裝好puppet并讓他們運行,然后剩余的工作都由puppet來完成.
細節和原理
puppet的目的是讓你只集中于你要管理的目標,而忽略實現的細節,例如命令名,參數或者文件格式.puppet把系統里面的用戶,軟件包,服務看作是"資源",puppet的作用就是管理這些資源以及資源之間的相互聯系.
底層支撐工具Providers,puppet有很多的資源類型,例如文件,用戶,軟件包,服務,不同的操作系統上對資源的管理命令是不一樣的,例如debian下面用APT安裝軟件,Red Hat下面用yum安裝軟件因此puppet對同一資源的管理可以有多個實現,配置資源的時候,可以明確的指定用什么provider.例如在redhat上配置一個package資源的時候,可以指定provider是yum.
Facter變量
在puppet客戶端分析代碼的時候,會把從facter傳送過來的對應的值賦值給變量.你可以單獨手工執行facter這個命令,這個命令會打印出它所收集到的關于主機的信息,例如ip地址等等.facter把收集到值發送給puppet服務器端,服務器端就可以根據不同的條件來對不同的節點機器生成不同的puppet配置文件.最重要的一個就是服務器的主機名.
工作方式流程
puppet既可以在單機上使用,也可以以c/s結構使用。在大規模使用puppet的情況下,通常使用c/s結構。在這種結構中puppet客戶端只是指運行puppet的客戶端,puppet服務器端是只運行puppetmaster的服務器.
puppet客戶端首先會連接到puppet服務器端,并且通過facter工具把客戶端的基本配置信息發送給服務器端.服務器端通過分析客戶端的主機名,通過node定義,找到該主機的配置代碼,然后編譯配置代碼,把編譯好的配置代碼發回客戶端,客戶端執行代碼完成配置。并且把代碼執行情況反饋給puppet服務器端.
修改系統配置
puppet通過管理資源的方式來管理系統,例如管理某個軟件是否要安裝,是安裝最新的還是安裝了就行.管理某個服務是否開啟,管理某個文件的屬性,內容等等.所有的資源都有對應的幾個屬性可以設置.通過設置屬性的方式來管理資源.有一種特殊的屬性可以用在所有的資源上面,這種屬性叫做metaparams(元參數或者元屬性).
資源之間關系
支持資源之間的關系配置是puppet的關鍵特性之一.一個資源的變更可以對另一個資源產生一個動作。例如/etc/apache.conf這個資源有改動,可以讓/etc/init.d/apache這個資源reload一下。假如一個資源依賴另一個資源,那么puppet會優先配置被依賴的資源,因此如果你的配置文件沒有準備好,對應的服務是不會先啟動的.
語言資源
puppet的全部就是管理資源,因此puppet語言的焦點就是處理這些資源,下面是一個基本的管理單個資源的例子.
file{"/etc/hosts":owner=root,group=root,mode=644}
上面的例子給出了定義一個資源所需要的所有組件,類型,名字和屬性.定義了一個file資源,資源的title(標題)是"/etc/hosts",資源的屬性里面設置了該文件屬于哪個用戶和組,以及文件的權限.
也可以在一個大括號里面定義多個資源,通過分號來區分.
避免重復配置
puppet的編譯器會避免在不同的代碼段里面管理同一個資源,如果在不同的代碼段對同一個資源進行配置,執行puppet的時候你會得到一個語法錯誤.puppet探測這種沖突的情況是通過判斷資源類型和資源的title(標題);如果兩個資源有相同的資源類型和title;那么就認為這兩個資源是表示同一個資源.
類
你可以把多個相關的資源定義在一起,組成一個類。可以在其他的代碼段include這個類.puppet還支持有限制的類的繼承,作用就是在子類里面的屬性可以覆蓋父類里面的屬性.
字符串
幾乎所有的東西和符號在puppet里面都被看作是字符串,包括數字和布爾值.但是如果你用引號把true和false引起來,他們會被當做字符串,例如你想賦值給某個資性"yes"的字符串.
變量
puppet除facter變量外,也可以自定義變量,但不允許你在同一個類里面對一個變量進行兩次賦值.
$myvar=value123
條件語句
Puppet支持常見的條件語句,使得你能根據不同的條件導入不同的資源定義。如if、case、另外puppet從版本0.24.6開始支持比較運算符。
數組
puppet非常有限的支持數組這種類型,你可以創建數組,并且給他們賦值,但是你不能刪除它們。數組用的最多的情況就是上面ssh例子里面,資源依賴哪種情況.或者是一次管理多個相同類型的資源。例如:user{[bin,adm]:ensure=>present}
函數
puppet提供一些有用的函數,例如template利用erb模板來生成文件內容,這樣就可以根據不同主機的情況,生成不同的配置文件。例如配置Squid的內存緩存大小,可以利用facter返回的內存值做一個簡單的數學計算,然后寫入到squid的配置文件,就是通過template來完成的.另外一個函數include可以讀入另外的puppet配置文件或者類。這樣可以把puppet的文件分割的更有規律.
節點
最后一個關于puppet語言的語法是節點定義"node",節點定義很象類定義,也支持繼承特性.當一個節點(puppet客戶端)連接到puppet服務器端,puppet解析器會查找這個節點的node代碼片斷,然后利用這個代碼片斷來生成該客戶端的配置代碼.puppet里面主機名來標明一個主機,因此主機名在puppet里面相當重要.如果puppet找不到匹配該主機名的node定義,就會用默認的節點定義來配置該主機.在node里面使用主機名,需要用單引號把主機名括起來.
node'server1'{include nginx}
在上面的代碼中,如果server1這個主機連接到puppet服務器,puppet服務器就會按照Nginx的代碼來配置這臺服務器.
自定義資源
puppet里面有一個非常有用的語法結構,叫做define,通過define可以把多個資源包裝成一個資源,或者把一個資源包裝成一個模型,便于使用。例如,在debian里面管理一個apache虛擬機非常簡單,把一個虛擬主機的配置文件放到/etc/sites-available/里面,然后做一個符號鏈接到/etc/sites-enabled目錄.你可以為你每個虛擬主機復制同樣的配置代碼.
版本
puppet有企業版和社區版,目前版本是2.6。
社區版是免費的,有些常用的功能。
企業版是收費的,支持VMware虛擬機的部署和審計功能。但如果10個節點以下是免費的。
2013年1月13日。
參考資料 >
puppet(一種Linux、Unix、windows平臺的集中配置管理系統).博客園.2024-02-22