Puppet簡單介紹
1)puppet是一種Linux/Unix平台下的集中配置管理系統,使用自有的puppet描述語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。puppet把這些系統實體稱之為資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關系。
2)Puppet是開源的基於Ruby的系統配置管理工具,puppet是一個C/S結構。所有的puppet客戶端同一個服務器端的puppet通訊,每個puppet客戶端每半小時(可以設置)連接一次服務器端,下載最新的配置文件,並且嚴格按照配置文件來配置服務器。 配置完成以后,puppet客戶端可以反饋給服務器端一個消息, 如果出錯,也會給服務器端反饋一個消息。
3)Puppet是用於大規模集群管理的神器。其本身使用Ruby語言開發,基於C/S架構。在每台機器上部署的客戶端每隔一個指定的時間會連接到Master檢查資源變化情況,若資源發生變化,將按配置動作進行相應的操作。
4)Puppet將所有可操作對象抽象為資源,目前涵蓋了40多種,如:File、User、Group、Host、Package、Service、Cron、Exec等。
5)Puppet 通過抽象資源的方式,使得每台機器能夠“清楚”其本身“應該”是什么“狀態”,而客戶端根據當前是否達到這個狀態決定采取指定的動作。這使得Puppet 不僅可用於傳統的應用部署,而且通過合理的手段,也能夠將比應用部署更頻繁的配置管理一並解決。甚至可以在Master端外接自己開發的平台,通過集中配 置方式管理各項“資源”,實現高度靈活的自動化管理體系。
這類垂直管理系統的使用及活躍,極大減輕了運維人員在重復性、批量化操作方面的負 擔,能夠非常有效地在各自領域完成既定的運維子目標。但其缺陷在於只能針對某一垂直領域的特定問題進行高效處理,對於它們之間的關聯性很難應對。因為運維 的本質是保證服務的可用性,而自動化運維則是在完全保證這一前提下,盡可能將需要人干涉的部分處理掉,所以判斷其優劣的標准則是——與人工處理比,對服務 的保證有沒有提高。如果僅是解決報警、部署這些單一動作,后續仍然需要人去處理、去關注、去判斷的話,就離這個目標還有距離,談不上真正的自動化,只能算 是工具化。
puppet是一個開源的軟件自動化配置和部署工具,它使用簡單且功能強大,正得到了越來越多地關注,現在很多大型IT公司均在使用puppet對集群中的軟件進行管理和部署,如google利用puppet管理超過6000台地mac桌面電腦(2007年數據)。
puppet設計架構是基於c/s架構的。服務器端保存着所有對客戶端服務器的配置代碼,在puppet里面叫做manifest. 客戶端下載manifest之后,可以根據manifest對服務器進行配置,例如軟件包管理,用戶管理和文件管理等等。
如上圖所示,puppet的工作流程如下
1)客戶端puppetd調用facter,facter探測出主機的一些變量,例如主機名,內存大 小,ip地址等。pupppetd 把這些信息通過ssl連接發送到服務器端; 2)服務器端的puppetmaster 檢測客戶端的主機名,然后找到manifest里面對應的node配置, 並對該部分內容進行解析,facter送過來的信息可以作為變 量處理,node牽涉到的代碼才解析,其他沒牽涉的代碼不解析。解析分為幾個階段,語法檢 查,如果語法錯誤就報錯。如果語法沒錯,就繼續解析,解析 的結果生成一個中間的“偽代碼”,然后把偽代碼發給客戶端; 3)客戶端接收到“偽代碼”,並且 執行,客戶端把執行結果發送給服務器; 4)服務器端把客戶端的執行結果寫入日志。
puppet工作過程中有兩點值得注意
1)為了保證安全,client和master之間是基於ssl和證書的,只有經master證書認證的 client可以與master通信; 2)puppet會讓系統保持在你所期望的某種狀態並一直維持下去,如檢測某個文件並保證其一直存在,保證ssh 服務始終開啟,如果文件被刪除了或者 ssh服務被關閉了,puppet下次執行時(默認30分鍾),會重新創建該文件或者啟動ssh服務。
Puppet語法(需要掌握Puppet中資源、屬性、類、模塊、變量、參數、節點等相關概念)
1)資源:資源可以是文件、服務、軟件包、自定義腳本等。
2)屬性:資源需要定義相關的屬性值,否則毫無意義。
3)類:將多個資源組織起來進行重新定義。
4)模塊:多個類的合集。
5)變量:Puppet與其他語言類似,同樣支持變量。
6)參數:又稱參變量。
7)節點:Puppet每一個客戶端,即主機(Host)。
資源
常用的資源主要有以下幾個: file:文件管理 package:軟件包管理 service:系統服務管理 cron:配置定期任務 exec:運行shell命令
每個資源的定義都具有標題、類型,以及一系列的屬性。每個資源在Puppet中名稱必須唯一。例如Puppet管理Nginx服務的主配置文件---nginx.conf,類型file,通常稱為File資源。
file {‘nginx.conf‘: ensure => file, mode =>‘06400‘, owner => root, group => root, } service {‘nginx‘; hasrestart => true, hasstatus => true, subscribe =file ["nginx.conf"], }
屬性
每個資源都有它相應的屬性,否則就失去意義。上面定義了4個屬性分別為:類型ensure、權限mode、用戶owner及用戶組資源定義兩個其他屬性值:hasrestart與hasstatus,這兩屬性值都為true.
類
通常類以應用名或作用名命名,比如應用軟件Nginx、Apache等
class nginx { file {‘nginx.conf‘: ensure => file, mode =>‘06400‘, owner => root, group => root, } service {‘nginx‘; hasrestart => true, hasstatus => true, subscribe =file ["nginx.conf"], } }
模塊
當類比較多的時候,就需要把類規范起來,定義成模塊的方式進行管理。
[root@node1 tmp]# tree /etc/puppet/modules/httpd/ /etc/puppet/modules/httpd/ |-- files |-- manifests | `-- init.pp `-- templates 3 directories, 1 file
節點
節點就是一個客戶端,通常以主機名命名。
[root@node1 tmp]# more /etc/puppet/manifests/nodes/node2.jiabin.com.pp node ‘node2.jiabin.com‘ { include test include httpd } [root@node1 tmp]# more /etc/puppet/manifests/site.pp import "nodes/node2.jiabin.com.pp"
通過以上代碼可以看到,node為定義了主機名為”node2.jiabin.com"的主機,並加載了httpd類,以及定義了主機變量$vhost.
Puppet語法風格
總體來說Puppet的語法規則是以括號"{}"分類,以冒號":"聲明,以逗號","屬性約束
例如:
package {‘nginx‘: ensure => present, }
必須使用兩個空格表示縮進;
不得使用文字制表符;
尾部不能有空格;
寬度不能超過80字符;
使用=>符號進行對齊。
變量的引用
不包含變量的字符串應該使用單引號(‘‘)括起來。需要應用變量是應使用雙引號("")括起來。字符串中的多有變量應該使用花括號"{}"括起來。
如:
"/etc/${file}.conf"
對變量本身的引用
變量是變量本身,不需要引號。
mode => $my_mode
資源
1)資源名
資源名采用單引號(‘‘)引起來,采用冒號(:)結尾。也可以使用(“”)的寫法
package {‘openssh‘: ensure => present }
package {"openssh": ensure => present }
2)對齊
3)屬性的順序
聲明資源時,應先定義ensure屬性。方便閱讀。
file { ‘/tmp/readme.txt‘: ensure => file, owner => root. ....... }
Puppet命令詳解
一、常用命令: puppet master #編譯配置文件、模板、節點的自定義插件 puppet agent #客戶端進程,負責從Master獲取數據 puppet cert #證書頒發,用於簽署證書 puppet kick #遠程控制agent,遠程觸發puppet agent命令 puppet apply #運行本地manifests 二、幫助: puppet doc #生成puppet文檔 puppet help #顯示puppet幫助信息 puppet resource #查看資源幫助 puppet describe #資源幫助 puppet status #查看puppet狀態 三、模塊和不常用命令: puppet module #從puppet forge創建、安裝、查詢模塊 puppet device #遠程管理網絡設備 puppet inspect #發送report報告 puppet filebucket #在filebucket中檢索和存儲文件 puppet queue #隊列進程
Puppet提供大量的命令來幫助我們進行有效的管理。Puppet中所有的命令都可以使用"puppet help"命令查看。
agent #客戶端進程,負責從Master獲取數據 apply #運行本地 manifests ca #本地證書的管理 catalog #編譯、保存、查看Puppet代碼 cert #證書頒發,用於簽署證書 certificate #提供訪問CA證書的管理 certificate_request #管理證書請求 certificate_revocation_list #管理撤銷證書的列表 config #配置選項 describe #管理遠程網絡設備 device #管理遠程網絡設備 doc #生成Puppet文檔 facts #系統信息檢查 file #在filebuckete中檢索和存儲文件 filebucket #在filebucket中檢索和存儲文件 help #查看幫助 inspect #發送report報告 instrumentation_data #管理監聽的數據 instrumentation_listener #管理監聽狀態 instrumentation_probe #管理監聽探測 key #創建、保存、刪除證書密鑰 kick #遠程控制Agent,遠程觸發puppet agent命令 man #查看手冊 master #服務端進程 module #從Puppet Forge創建、安裝、查詢模塊 node #管理節點 parser #解析器管理 plugin #插件管理 queue #隊列進程 report #創建、查看報告 resource #查看資源幫助 resource_type #查看類、默認資源類型與節點信息 secret_agent #模擬Agent status #查看Puppet狀態
1)puppet master
參數詳解如下:
--daemonize: #-D發送到后台守護進程,默認選項 --no-daemonize: #不發送到后台守護進程 --debug: #-d啟用完整的調試模式 --help: #-h查看幫助 --logdest: #-l日志送發方式,默認采用syslog配置 --verbose: #-v顯示詳細信息 --version: #-V打印Puppet版本 --compile: #以JSON的方式輸出編譯的catalog
--genconfig輸出默認的配置文件,代碼如下:
[root@node2 ~]# puppet master --genconfig>puppet.conf
最常用的是不啟用守護進程的方式運行,用於調試Puppet代碼
2)puppet agent
puppet agent在每個節點以守護進程方式運行,通常每30分鍾向master請求一次,以確認信息並詢問是否有變更,然后復制運行編譯好的Catalog代碼。
命令的參數詳解如下:
--certname: #指定客戶端certname(唯一ID) --daemonize: #-D發送到后台守護進程,默認選項 --no-daemonize: #不發送到后台守護進程 --debug: #-d啟用完整的調試模式 --detailed-exitcodes: #提供詳細的退出代碼 --digest: #指定證書指紋算法,默認為MD5算法 --disable: #禁用,禁止puppet agent在此節點執行 --enable: #啟用,重新允許執行puppent agent --fingerpring: #顯示當前證書的指紋 --logdest: #-l 日志發送方式,默認采用syslog配置 --no-client: #不要創建客戶端配置文件,當listen=true --noop: #使用‘noop’模式,Puppet運行Catalog --onetime: #-o 運行一次,配合--no-daemonize使用 --server: #啟動另一類型的服務 --test: #-t 測試,常用選擇 --verbose: #-v 顯示詳細信息 --version: #-V 打印Puppet版本 --waitforcert #-w 當master未簽署此節點證書時,puppet agent 將等待簽署,並默認每2分鍾重新連接master以確認是否完成簽署
主要命令apply
puppet apply 命令參數詳解
--debug: #啟用完整的調試模式 --detailed-exitcodes: #提供詳細的退出代碼 --help: #幫助 --loadclasses: #加載任何已保存類 --logdest: #日志送發方式,默認采用syslog配置 --noop: #使用‘noop’模式 --execute: #執行命令中指定的Puppet代碼 --verbose: #顯示詳細信息 --catalog: #運行puppet master采用--compile輸出JSON
puppet cert :用於管理本地證書 查看未簽名證書 簽署證書 廢除證書 清除證書
clean // 清除 用於清除證書 fingerprint // 打印證書指紋 generate // 生成客戶端證書 list // 查看認證客戶端列表 print // 打印主機證書的全文信息 revoke // 廢除已認證的主機 sign // 簽署認證 verify // 驗證本地指定的認證 參數: --all // 執行所有操作,包括'sign','clean','list','fingerprint' --digest // 設置證書指紋加密的方式,取決於openssl版本 --debug // 啟用完整的調試模式 --help // 查看幫助 --verbose // 顯示詳細信息 --version // -V 打印puppet版本
puppet kick :用於連接到agent 讓他主動運行puppet agent --test命令,主動觸發
需要agent節點puppet 配置文件字段增加 listen=true 需要agent 節點防火牆允許8139端口 需要agent auth.conf插入配置 #allow puppet kick access path /run method save auth any allow puppet.master.domain.com 參數: --all // -a 指定所有主機,常用選項 --class // -c 指定類 --debug // -d 啟用完整的調試模式 --foreground // -f 直到主機運行時才返回,默認是false --help // -h 查看幫助 --host // 指定主機 常用選項 --ignoreschedules // 客戶端忽略計划任務,但會影響效率 默認為false --parallel // 並發連接,提高效率,但會導致master壓力增大 --tag // -t 指定標簽 --test // 測試 --ping // -p 對目標主機做icmp echo ,路過不響應的主機
puppet describe : 提供資源的類型,providers 和metaparameters的幫助
--help // -h 查看幫助 --providers // -p 列出類型詳細說明 --list // -l 列出所有類型 --meta // -m 列出所有metaparameters --short // -s 僅列出參數,不顯示細節
pupet resource :提供一個簽單的工具,獎系統資源轉換成puppet代碼
命令參數: --debug // -d 啟用完整的調試模式 --edit // -e 將查詢結果定入文件 --host // -H 指定要查詢的主機 --help // -h 查看幫助 --param // -p 添加更多參數進行查詢 --types // -t 顯示所有類型信息 --verbose // -v 顯示詳細信息
============================================================================
一些手記快速組合命令
puppet cert sign agentname // 對agent主機進行簽名 --all 對所有等待簽名的主機授權 puppet cert --clean host // 刪除host認證信息 --all表示刪除所有agent主機的證書 puppet cert list --all //命令可以查看客戶端已經加入 puppet cert signagent_name //來簽發證書 puppet apply --test --verbose //查看客戶端申請證書的詳細過程 puppet doc --reference configuration // 配置參考手冊 puppet agent --configprint confdir // 輸出配置文件目錄 puppet parser validate init.pp // 服務端檢查配置文件 2.6版本中puppet --aprseonly init.pp
實例一、將輸出信息輸出到日志文件
[root@node1 manifests]# puppet apply -l /tmp/init.log init.pp ** (process:18930): WARNING **: nm_client_get_devices: error getting devices: The name org.freedesktop.NetworkManager was not provided by any .service files [root@node1 manifests]# cd /tmp/ [root@node1 tmp]# cat init.log Wed Dec 31 11:55:36 +0800 2014 Puppet (notice): Compiled catalog for node1.jiabin.com in environment production in 0.04 seconds Wed Dec 31 11:55:36 +0800 2014 Puppet (notice): Finished catalog run in 0.01 seconds
實例二、在客戶端運行命令
[root@node2 ~]# mkdir -p /etc/puppet/modules/test/manifests [root@node2 ~]# vim /etc/puppet/modules/test/manifests/init.pp [root@node2 ~]# puppet apply -e "include test" --noop Notice: Compiled catalog for node2.jiabin.com in environment production in 0.10 seconds Notice: Finished catalog run in 0.02 seconds 去除 --noop后可以查看/tmp下生成的node2.txt文件 [root@node2 ~]# puppet apply -e "include test" Notice: Compiled catalog for node2.jiabin.com in environment production in 0.07 seconds Notice: Finished catalog run in 0.03 seconds [root@node2 ~]# cd /tmp/ [root@node2 tmp]# ls helloworld.txt node2.txt [root@node2 tmp]# cat node2.txt Hello World![root@node2 tmp]#
實例三、使用apply運行master編譯好的JSON文件。需要在服務端使用compile參數生成JSON文件再傳遞至客戶端執行。
1)先修改test類的內容,將"Hello World!" 修改為“Testing JSON!":
[root@node1 tmp]# vim /etc/puppet/modules/test/manifests/init.pp class test { file { "/tmp/$hostname.txt": content => "Testing JSON!";} }
2)使用compile參數生成JSON文件,代碼如下:
[root@node1 tmp]# puppet apply --catalog node2.jiabin.com.json