Puppet自動化集群管理基礎篇
Puppet作為開源的集群管理框架,有著簡單易用、快速部署、使用范圍廣等特性,已經積累了超過250家的用戶,包括阿里巴巴、新浪、Oracle等大公司。本文作者將帶領大家了解puppet技術及其簡單的應用。
背景簡介
在傳統的服務器集群管理中,每增加一臺服務器,都需要對該服務器進行相應的配置。如果服務器數量少,那逐一對服務器進行配置是沒問題的。但是在目前的生產環境中,服務器數量動輒就是成千上萬臺。傳統的集群管理方案耗時耗力,已無法快速有效的適應生產環境的需求。目前,在公司內部存在3萬多臺的web服務器,如何對其進行快速部署成為公司內部亟待解決的問題。主要需求包括:
- 突然有一天,某機房DNS出問題了,需要換個DNS。
- 基于某個模板的業務快速上線。
- Apache的配置需要將robots文件的配置修改。
- 快速安裝某個軟件某個模塊。
- 修改了某個配置,需要重啟對應服務。
- 某天我們對某臺機器做某個測試修改了配置,又某天我們對另外一臺機器測試又修改了一個配置,越積越多。
如何快速的解決以上情況所引起的生產環境失效的問題,我們對自動化集群管理工具puppet進行了調研,從軟件包、配置文件和服務三種類型的資源出發,對服務器集群進行了自動化管理設計。
1. Puppet是什么
Puppet是一種跨平臺、C/S架構的集中配置管理系統,可以用于管理linux、windows、unix、mac等平臺下的用戶、軟件包、文件、服務和cron任務等,并且可以妥善處理資源之間的依賴關系。其使用ruby語言開發,但是使用者并不需要了解ruby語言,因為其僅僅依賴于一種以pp為后綴的文件,在puppet框架搭建好后,就只剩下模塊的開發,模塊開發采用描述性語言和基本的邏輯控制語句,簡單易懂,非常適合于管理和部署大規模的集群系統。
2. Puppet架構
Puppet使用C/S架構,分為puppet server(master)和puppet client(agent)。master是配置和管理中心,管理著所有的節點。系統管理員需要在master上編寫每個節點所對應的pp文件來描述不同節點的資源集合和目標狀態。各個agent會周期性的查詢master,來獲取自己的配置,并將結果以報告的形式傳送給master。
puppet使用ssl認證,在client與master通訊認證通過后,證書會存儲在master上,當僅有一臺master時,這不會產生問題。但是,在我們的設計中,為了保證高可用和高并發,master是集群,master集群的前面是負載均衡,同一client與master多次通信時,無法保證連接的是同一個master,也就是說無法保證證書的獲取。為此,puppet官方建議搭建單獨的CA認證服務器,從而實現證書的統一中心化管理。因此在大規模集群管理系統中,常見的puppet架構如上圖,本公司同樣也采用了該架構搭建集群管理系統。
3. Puppet工作流程
Puppet既可以單機運行,也可以通過C/S架構的方式運行,不過在大多數情況下還是基于C/S架構的方式來運行,其交互過程如下圖所示。
- agent通過ssl向master建立認證。
- 建立認證后,puppet調用agent的facter,探測出主機的一些內置變量,如主機名、系統版本號、ip地址和負載等信息。Agent將這些信息通過ssl加密發送到master端。
- Master接收到agent的主機信息請求后,根據域名或ip地址將他們發送到本機的manifests或ENC,進行節點配置信息的查詢。
- 在解析過程中,首先進行語法檢查,如果有語法錯誤,則停止,返回錯誤信息,否則繼續解析生成catalog。
- Puppet客戶端agent對服務端生成的catalog進行應用。
- Puppet客戶端agent對catalog進行代碼驗證并執行,并將結果記入日志。
- 將agent信息以報告的形式上報master。
- 流程結束。
4. Puppet安裝與配置
基于公司內部已有的DNS域名解析和LVS負載均衡服務,圍繞puppet的整個集群管理系統架構圖,在centos環境下,puppet安裝與配置方法如下:
(1) Master
目前使用了4臺master用于管理15000臺左右的服務器,如果后期master壓力增大,再適當的擴容。配置步驟如下:
1)安裝puppet的相關包,包括puppet-server、Apache、mod_ssl、mod_passenger。
在安裝以上包的同時,系統會自動安裝facter包和一些ruby依賴包。
2)編輯 /etc/puppet/puppet.conf配置文件。
3)復制CA服務器上的證書,主要是打包CA服務器上的ssl目錄,并放到master上的ssl目錄下。
4)初始化master,生成必須文件。
5)建立/etc/httpd/conf.d/puppet.conf配置文件。
6)創建虛擬主機的DocumentRoot。
7)啟動puppet。
2. CA
將master和agent的認證機制放在單獨的CA服務器上,可以方便master集群的管理和擴容。配置步驟如下:
1)安裝puppet的相關包,包括puppet-server、Apache、mod_ssl、mod_passenger。
2)編輯/etc/puppet/puppet.conf配置文件。
3)創建/etc/puppet/autosign.conf配置文件,如果內容是“*”,表示所有主機都可訪問。
4)啟動一下puppet master,實現初始化,生成key和自認證。
5)為master服務器生成證書。
6)建立/etc/httpd/conf.d/puppet.conf配置文件,文件的設置參照master的配置。
7)創建虛擬主機的DocumentRoot,參照master的配置。
8)啟動puppet,參照master的配置。
3. Agent
Puppet客戶端安裝比較簡單,配置步驟如下:
1)安裝puppet的相關包,包括addops-puppet、addops-puppet-agent-extra(公司內部包)。其中第一個包為yum源包,第二個包為puppet的擴展包,其依賴于puppet包,并且會自動修改配置文件中的ca_server、server和node_name_value三個變量的值。
2)測試運行:puppet agent --test,默認同步的環境為production,可以手動添加環境參數,如--environment=staging,即可改為臨時環境。
5. Puppet配置解讀
puppet的主配置文件puppet.conf位于/etc/puppet/(社區版)目錄下,其中主要包含了main、master和agent三個命名空間,依次介紹如下:
1)main通用配置選項
- confdir:配置文件存放目錄,默認在/etc/puppet。
- vardir:動態數據存放目錄,默認在/var/lib/puppet。
- logdir:日志存放目錄,默認在/var/log/log。
- rundir:PID存放目錄,默認在/var/run/puppet。
- statedir:狀態存放目錄,默認在$vardir/state。
- ssldir:SSL證書存放目錄,默認在$vardir/ssl。
- trace:發生錯誤時顯示跟蹤信息,默認false。
- filetimeout:檢測配置文件狀態改變的時間周期,單位秒,默認15秒。
- syslogfacility:指定syslog功能的級別,默認為daemon級。
- manifestdir:系統的啟動文件存放目錄,默認在/etc/puppet/manifests。
- basemodulepath:模塊的存放目錄,默認為/etc/puppet/modules,可以指定多個。
- pluginsync:當有自定義facter變量時,需要指定該值為true。
- ca_server:認證服務器的名稱。
2)Master服務端配置選項
- user:后臺進程執行的用戶。
- group:后臺進程執行的組。
- certname:進行ssl認證時的變量名,默認為主機名。
- node_name_value:節點名稱,默認為主機名。
- mainfest:mainfest站點文件的名字,默認為site.pp。
- bindaddress:后臺進程綁定的網卡地址接口。
- masterport:后臺進程執行的端口,默認為8140。
- ca:當認證服務器位于單獨的服務器上時,需要指定該值為false。
3)Agent客戶端配置選項
- classfile:顯示從服務端加載到的類列表。
- localconfig:本地緩存配置目錄。
- runinterval:客戶端的檢測時長,默認為30分鐘檢測一次。
- listen:監聽進程,用于監聽服務端下發的同步信息。
- report:值為true時,向master端發送報告。
- node_name_value:節點名稱,默認為主機名。
- certname:認證名稱,默認為主機名。
- Server:master的認證名稱,即certname變量的值。
6. Puppet資源簡介
資源是puppet系統的核心,抽象的足夠徹底,相似的資源被抽象成了一種資源類型,如程序包資源、文件資源、服務資源和exec資源等。資源屬性與其實現方式剝離開來,僅僅描述資源的狀態,而不是其具體的實現過程,即可達到資源的同步。
(1) 資源定義
資源定義即向資源類型的屬性賦值,也稱為資源類型的實例化。資源的定義在pp文件中完成,其目錄結構一般如下所示:
Files文件夾用于存放該軟件包的配置文件,manifests文件夾用于存放資源的實例,即類文件,templates用于存放模板。
定義的資源語法如下:
Type即為資源的類型,比如程序包資源package,文件資源file等,title是一個字符串,在同一類型中必須唯一,每個屬性用“,”隔開。通過將class、條件控制語句與資源的定義相結合,即可實現資源的模塊化,達到易復用的效果。
(2) 常用資源
基于公司內部運維組的需求,puppet主要從程序包、配置文件、服務、exec四個方面展開應用,本文主要對前兩種資源展開介紹。另外,我們可以利用“Puppet describe 資源名稱”命令查看資源的詳細描述。
1)程序包package
Package資源的描述如上圖所示,下來我們將對package資源的主要屬性進行介紹:
- name:包名,可以省略,如果省略,將繼承title的值。
- ensure:指定軟件包的狀態,安裝、卸載還是升級。需要卸載時,指定為“absent”;需要保證新版本時,指定為“latest”;需要保證某一版本時,指定為版本號。
- source:指定程序包的來源。如果本地yum倉庫已經包含該包,則可以不指定。
- provider:指明安裝方式。
使用案例如下:
其中,package_name和package_ensure是傳入的參數值,通過對屬性以參數的形式賦值,可以大大提高模塊的復用性。
2)配置文件file
file資源的描述如上圖所示,下來我們將對file資源的主要屬性進行介紹:
- ensure:文件的狀態,值有absent、present、file、directory和link。
- path:文件路徑,不指定時為title的值。“ensure=>absent”共用。
- owner:文件的屬主。
- Group:文件的屬組。
- Mode:文件的權限。
- Source:文件來源。
使用案例如下:
服務和exec資源在這里不再贅述,可以利用上述提到的命令,查看資源的詳細介紹和參數的使用方法。從以上案例可以看出,采用puppet描述語言,結合常用的邏輯控制語句,可以快速的開發出不同資源的類模塊。
結論
隨著服務器集群規模的增大,公司越來越重視通過自動化配置來減小管理部署的成本。Puppet作為開源的集群管理框架,有著簡單易用、快速部署、使用范圍廣等特性,已經有超過250家的用戶,包括Zynga、Twitter、Citrix、Oracle、Shopzilla、Google、RedHat、新浪、阿里巴巴、豆瓣、好樂買、趣游、PPTV等大公司。本文主要介紹了puppet架構、安裝方法以及資源的使用案例,屬于puppet集群管理的基礎篇。隨著puppet集群規模的增大,將來我們會繼續介紹puppet中的facter工具、hiera工具、模塊編寫規范、master集群擴展,逐漸搭建一套大規模、健壯的puppet自動化管理集群。
相關文章:
- https://puppet.com/docs/puppet/6.4/puppet_index.html
- https://www.cnblogs.com/keerya/p/8040071.html#_label0_2
- https://blog.51cto.com/superleedo/1899823
- https://www.ibm.com/developerworks/cn/opensource/os-cn-puppet/index.html
【本文是51CTO專欄機構360技術的原創文章,微信公眾號“360技術( id: qihoo_tech)”】