Puppet
Puppet是開源的基於Ruby的系統配置管理工具,依賴於C/S的部署架構。puppet使用跨平臺語言規範,管理配置文件、用戶、軟件包、系統服務等內容,在puppet裏這些內容都被看做是“資源”,每種資源都有對應的屬性,如軟件包有安裝不安裝的屬性,文件有權限屬性等。Puppet的代碼主要由這些資源和其屬性組成。其代碼化的好處:分享,保存,快速的恢復和部署。
Puppet客戶端默認每半小時連接一次服務器端(此時puppet客戶端進程工作在後臺模式,也可根據需要手動執行),從服務器端下載最新的配置文件,並且嚴格按照配置文件來配置服務器. 配置完成以後,puppet客戶端可以反饋給服務器端一個消息. 簡單流程可如下圖:
工作流程:
①Agent向Master端發起認證請求
②Master端驗證其合法性,允許其連接
③Agent將本機變量(主機名、內存大小、IP地址等)通過SSL連接發送給Master
④Master檢測Agent的主機名,然後找到manifest對應的node配置,並對該部分內容進行解析。解析結果生成一個“僞代碼”(catelog),並將其發給Agent
⑤Agent接收到“僞代碼”,開始執行
⑥執行時判斷有沒有File文件,如果有,則向fileserver發起請求
⑦判斷有沒有配置Report,如果已配置,則把執行結果發送給服務器
⑧執行結束,檢測系統狀態
https: 互相驗正彼此的證書;加密;
master: 證書,一般爲自籤,master可自行扮演CA的角色;
agent: 證書,生成CSR發送給master(CA)
IT基礎設施自動化管理的整個生命週期:
provisioning
configuration
orchestration
reporting
資源
Puppet語言的基礎在於對資源的聲明。每個資源都定義了系統的一個組件,例如某個必須運行的服務,或是某個必須被安裝的包。以下是一些其它類型資源的示例:
某個用戶帳號
某個特定的文件
某個文件夾
某個軟件包
某個運行中的服務
可以將資源想象爲構建塊,他們將結合在一起,對你所管理的系統的目標狀態進行建模。 接下來,我們將接觸到Puppet中更深入核心的定義,這些定義允許你以一種經濟的方式將資源進行結合,而經濟正是Puppet的關鍵特色之一。
類型與提供者
Puppet將類似的資源以類型的方式進行組織。舉例來說,用戶是一種類型,文件是另一種類型,而服務又是一種類型。當你正確地對某個資源的類型進行描述之後,接下來只需描述該資源所期望的狀態即可。比起傳統的寫法:“運行這個命令,以啓動XYZ服務”,你只需簡單地表示:“保證XYZ處於運行狀態”就可以了。
提供者則在一種特定的系統中,使用該系統本身的工具實現各種資源類型。由於類型與提供者的定義被區分開來,因此某個單一的資源類型(例如“包”)就能夠管理多種不同的系統中所定義的包。舉例來說,你的“包”資源能夠管理Red Hat系統下的yum、基於Debian的系統下的dpkg和apt,以及BSD系統中的端口。
管理員通常來說不大有機會對提供者進行定義,除非管理員打算改變系統的默認值。Puppet中已經精確的寫入了提供者,因此你無需瞭解如何對運行在基礎設施中的各種操作系統或平臺進行管理。再次聲明,由於Puppet將細節進行了抽象,因此你無需擔心各種細節問題。如果你確實需要編寫提供者,那也通常能夠找到一些簡單的Ruby代碼,其中封裝了各種shell命令,因此通常非常簡短,同時也便於創建。
類型和提供者使得Puppet能夠運行在各種主流平臺上,並且允許Puppet不斷成長與進化,以支持運算服務器之外的各種平臺,例如網絡與存儲設備。
下面的一個示例將爲你展現Puppet語言的便捷性,它首先演示瞭如何用shell腳本添加一個新用戶以及一個新的組,這與Puppet中始終一致的操作形成鮮明對比。而在使用Puppet的示例中,“用戶”和“組”都是類型,Puppet能夠自動找到適用於你的平臺的提供者。相比之下,特定於平臺的過程式腳本無論是編寫還是理解都要困難得多。
類、清單與模塊
Puppet語言中的其它元素的主要作用是爲資源的聲明提供更多的靈活性和便捷性。類在Puppet中的作用是切分代碼塊,將資源組織成較大的配置單元。舉例來說,一個類能夠包括所有安裝和配置NTP時必須的Puppet代碼。類的創建與調用可以在不同的地方完成。
不同的類集合可以應用在扮演不同角色的節點上。我們將其稱之爲“節點分類”,這是一項非常強大的能力,它允許你根據節點的能力,而不是根據節點的名稱對他們進行管理。這種“別把家畜當寵物”的機器管理方式,得到了許多快速發展的組織的偏愛。
Puppet語言文件被稱爲清單,最簡單的Puppet部署方式就是一個單獨的清單文件加上一些資源。如果我們爲以上示例中的基礎Puppet代碼命名爲“user-present.pp”文件,那它就成爲了一個清單。
模塊是一系列類、資源類型、文件和模板的結合,他們以一某個特定的目的,並按照某種特定的、可預測的結構組織在一起。模塊可以爲了各種目的而創建,可以是對Apache實例進行完整的配置以搭建一套Rails應用程序,也可以爲各種其它目的進行創建。通過將各種複雜特性的實現封裝在模塊中,管理員就能夠使用更小、可讀性更好的清單文件對模塊進行調用。
Puppet模塊的一個巨大優勢在於模塊的重用性。你可以自由使用他人編寫的模塊,並且Puppet有一個參與者數量巨大的活躍社區,除了Puppet Labs的員工所提編寫的模塊之外,社區成員們也會免費地分享他們所編寫的模塊。你能夠在Puppet Forge上找到超過3000個可以免費下載的模塊,其中有許多模塊是系統管理員的工作中最常見的一些任務,因此這些模塊能夠節約你大量的時間。比方說,你可以使用模塊進行各種管理任務,包括簡單的服務器構建塊(NTP、SSH)管理,乃至複雜方案(SQL Server或F5)的管理。
類、清單和模塊都是純粹的代碼,與組織中所需要的其它任何在代碼一樣,它們能夠、也應該被簽入到版本控制系統當中,稍後我們將對這一點展開討論。
安裝步驟:
程序包:
http://yum.puppetlabs.com/
http://docs.puppetlabs.com/guides/install_puppet/install_el.html
安裝yum:
[root@hzm puppet]# yum -y install puppet
基本用法:
puppet describe --list ##查看puppet的資源列表 puppet describe 資源名稱 ##查看該資源的使用方法 puppet apply *.pp ##應用定義的資源清單
定義資源:保存於資源清單(manifest)中,
Resource_TYPE {title: attribute1 => value1, attribute2 => value2, }
注意:Resource_TYPE必須全部使用小寫字母;同一類型中的資源的title不允許相同;
實例:
定義一個用戶資源,創建一個用戶:
[root@hzm manifests]# vim test1.pp user {'hzm' : uid => '666', shell => '/bin/bash', ensure => present, }
測試一下:
[root@hzm manifests]# puppet apply --test --noop --verbose test1.pp Notice: Compiled catalog for hzm.com in environment production in 0.12 seconds Info: Applying configuration version '1449350959' Notice: /Stage[main]/Main/User[hzm]/ensure: current_value absent, should be present (noop) Notice: Class[Main]: Would have triggered 'refresh' from 1 events Notice: Stage[main]: Would have triggered 'refresh' from 1 events Info: Creating state file /var/lib/puppet/state/state.yaml Notice: Finished catalog run in 0.03 seconds [root@hzm manifests]#
--noop:pupet運行catalog,但不執行配置
測試ok,在創建:
[root@hzm manifests]# puppet apply --verbose test1.pp Notice: Compiled catalog for hzm.com in environment production in 0.11 seconds Info: Applying configuration version '1449351226' Notice: /Stage[main]/Main/User[hzm]/ensure: created Notice: Finished catalog run in 0.11 seconds [root@hzm manifests]#