開發原因
系統管理員都喜歡自己寫點小工具來讓自己的工作完成的更快或者更好,不管是在大企業管理大量的伺服器還是只管理兩三台機器.但是很少人會把他們的工具發布出來.也就是是說極少有工具能被重用,或者說很多工具就只能在所在的組織內部有用.拷貝給別的組織,他們也用不上.也就是說,每個系統管理員,在一個新的公司,都會另起爐灶開發一套基於ssh,for循環的"系統"來幫助自己完成系統管理任務.
開發puppet是為了讓系統管理員可以相互交流和共享成熟的工具,避免重複的勞動.通過以下兩個特性來實現這一目標:
提供一個簡潔的但是強大的框架來完成系統管理任務
系統管理任務可以描述成puppet語言,因此可以相互分享代碼,就像分享其他語言的代碼一樣,比如python,c等
因此,作為系統管理員的你可以更快的完成工作,因為你可以用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的作用就是管理這些資源以及資源之間的相互聯繫.
底層支撐工具Providers,puppet有很多的資源類型,例如檔案,用戶,軟體包,服務,不同的作業系統上對資源的管理命令是不一樣的,例如debian下面用apt-get安裝軟體,redhat下面用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'{includenginx}
在上面的代碼中,如果server1這個主機連線到puppet伺服器,puppet伺服器就會按照nginx的代碼來配置這台伺服器.
自定義資源
puppet裡面有一個非常有用的語法結構,叫做define,通過define可以把多個資源包裝成一個資源,或者把一個資源包裝成一個模型,便於使用.例如,在debian裡面管理一個apache虛擬機非常簡單,把一個虛擬主機的配置檔案放到/etc/sites-available/裡面,然後做一個符號連結到/etc/sites-enabled目錄.你可以為你每個虛擬主機複製同樣的配置代碼.
版本
puppet有企業版和社區版,目前版本是2.6。
社區版是免費的,有些常用的功能。
企業版是收費的,支持vmware虛擬機的部署和審計功能。但如果10個節點以下是免費的。
2013年1月13日。