Puppet簡單介紹node
1)puppet是一種Linux/Unix平臺下的集中配置管理系統,使用自有的puppet描述語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。puppet把這些系統實體稱之爲資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。nginx
2)Puppet是開源的基於Ruby的系統配置管理工具,puppet是一個C/S結構。全部的puppet客戶端同一個服務器端的puppet通信,每一個puppet客戶端每半小時(能夠設置)鏈接一次服務器端,下載最新的配置文件,而且嚴格按照配置文件來配置服務器。 配置完成之後,puppet客戶端能夠反饋給服務器端一個消息, 若是出錯,也會給服務器端反饋一個消息。算法
3)Puppet是用於大規模集羣管理的神器。其自己使用Ruby語言開發,基於C/S架構。在每臺機器上部署的客戶端每隔一個指定的時間會鏈接到Master檢查資源變化狀況,若資源發生變化,將按配置動做進行相應的操做。shell
4)Puppet將全部可操做對象抽象爲資源,目前涵蓋了40多種,如:File、User、Group、Host、Package、Service、Cron、Exec等。json
5)Puppet 經過抽象資源的方式,使得每臺機器可以「清楚」其自己「應該」是什麼「狀態」,而客戶端根據當前是否達到這個狀態決定採起指定的動做。這使得Puppet 不只可用於傳統的應用部署,並且經過合理的手段,也可以將比應用部署更頻繁的配置管理一併解決。甚至能夠在Master端外接本身開發的平臺,經過集中配 置方式管理各項「資源」,實現高度靈活的自動化管理體系。vim
這類垂直管理系統的使用及活躍,極大減輕了運維人員在重複性、批量化操做方面的負 擔,可以很是有效地在各自領域完成既定的運維子目標。但其缺陷在於只能針對某一垂直領域的特定問題進行高效處理,對於它們之間的關聯性很難應對。由於運維 的本質是保證服務的可用性,而自動化運維則是在徹底保證這一前提下,儘量將須要人干涉的部分處理掉,因此判斷其優劣的標準則是——與人工處理比,對服務 的保證有沒有提升。若是僅是解決報警、部署這些單一動做,後續仍然須要人去處理、去關注、去判斷的話,就離這個目標還有距離,談不上真正的自動化,只能算 是工具化。安全
puppet是一個開源的軟件自動化配置和部署工具,它使用簡單且功能強大,正獲得了愈來愈多地關注,如今不少大型IT公司均在使用puppet對集羣中的軟件進行管理和部署,如google利用puppet管理超過6000臺地mac桌面電腦(2007年數據)。bash
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命令詳解
1、經常使用命令: puppet master #編譯配置文件、模板、節點的自定義插件 puppet agent #客戶端進程,負責從Master獲取數據 puppet cert #證書頒發,用於簽署證書 puppet kick #遠程控制agent,遠程觸發puppet agent命令 puppet apply #運行本地manifests 2、幫助: puppet doc #生成puppet文檔 puppet help #顯示puppet幫助信息 puppet resource #查看資源幫助 puppet describe #資源幫助 puppet status #查看puppet狀態 3、模塊和不經常使用命令: 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
實例1、將輸出信息輸出到日誌文件
[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
實例2、在客戶端運行命令
[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]#
實例3、使用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