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
2
3
4
5
6
<code>1)用戶端puppetd調用facter,facter探測出主機的一些變量,例如主機名,記憶體大 小,ip位址等。pupppetd 把這些資訊通過ssl連接配接發送到伺服器端;</code>
<code>2)伺服器端的puppetmaster 檢測用戶端的主機名,然後找到manifest裡面對應的node配置, 并對該部分内容進行解析,facter送過來的資訊可以作為變</code>
<code> </code><code>量處理,node牽涉到的代碼才解析,其他沒牽涉的代碼不解析。解析分為幾個階段,文法檢 查,如果文法錯誤就報錯。如果文法沒錯,就繼續解析,解析</code>
<code> </code><code>的結果生成一個中間的“僞代碼”,然後把僞代碼發給用戶端;</code>
<code>3)用戶端接收到“僞代碼”,并且 執行,用戶端把執行結果發送給伺服器;</code>
<code>4)伺服器端把用戶端的執行結果寫入日志。</code>
puppet工作過程中有兩點值得注意
<code>1)為了保證安全,client和master之間是基于ssl和證書的,隻有經master證書認證的 client可以與master通信;</code>
<code>2)puppet會讓系統保持在你所期望的某種狀态并一直維持下去,如檢測某個檔案并保證其一直存在,保證</code><code>ssh</code> <code>服務始終開啟,如果檔案被删除了或者</code>
<code> </code><code>ssh</code><code>服務被關閉了,puppet下次執行時(預設30分鐘),會重新建立該檔案或者啟動</code><code>ssh</code><code>服務。</code>
Puppet文法(需要掌握Puppet中資源、屬性、類、子產品、變量、參數、節點等相關概念)
1)資源:資源可以是檔案、服務、軟體包、自定義腳本等。
2)屬性:資源需要定義相關的屬性值,否則毫無意義。
3)類:将多個資源組織起來進行重新定義。
4)子產品:多個類的合集。
5)變量:Puppet與其他語言類似,同樣支援變量。
6)參數:又稱參變量。
7)節點:Puppet每一個用戶端,即主機(Host)。
資源
<code>常用的資源主要有以下幾個:</code>
<code>file</code><code>:檔案管理</code>
<code>package:軟體包管理</code>
<code>service:系統服務管理</code>
<code>cron</code><code>:配置定期任務</code>
<code>exec</code><code>:運作shell指令</code>
每個資源的定義都具有标題、類型,以及一系列的屬性。每個資源在Puppet中名稱必須唯一。例如Puppet管理Nginx服務的主配置檔案---nginx.conf,類型file,通常稱為File資源。
7
8
9
10
11
<code>file</code> <code>{‘nginx.conf‘:</code>
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>mode =>‘06400‘,</code>
<code> </code><code>owner => root,</code>
<code> </code><code>group => root,</code>
<code> </code><code>}</code>
<code> </code><code>service {‘nginx‘;</code>
<code> </code><code>hasrestart => </code><code>true</code><code>,</code>
<code> </code><code>hasstatus => </code><code>true</code><code>,</code>
<code> </code><code>subscribe =</code><code>file</code> <code>[</code><code>"nginx.conf"</code><code>],</code>
屬性
每個資源都有它相應的屬性,否則就失去意義。上面定義了4個屬性分别為:類型ensure、權限mode、使用者owner及使用者組資源定義兩個其他屬性值:hasrestart與hasstatus,這兩屬性值都為true.
類
通常類以應用名或作用名命名,比如應用軟體Nginx、Apache等
12
13
14
<code>class nginx {</code>
<code>file</code>
<code> </code><code>{‘nginx.conf‘:</code>
子產品
當類比較多的時候,就需要把類規範起來,定義成子產品的方式進行管理。
<code>[root@node1 tmp]</code><code># tree /etc/puppet/modules/httpd/</code>
<code>/etc/puppet/modules/httpd/</code>
<code>|-- files</code>
<code>|-- manifests</code>
<code>| `-- init.pp</code>
<code>`-- templates</code>
<code>3 directories, 1 </code><code>file</code>
節點
節點就是一個用戶端,通常以主機名命名。
<code>[root@node1 tmp]</code><code># more /etc/puppet/manifests/nodes/node2.jiabin.com.pp</code>
<code>node ‘node2.jiabin.com‘ {</code>
<code>include </code><code>test</code>
<code>include httpd</code>
<code>}</code>
<code>[root@node1 tmp]</code><code># more /etc/puppet/manifests/site.pp</code>
<code>import</code> <code>"nodes/node2.jiabin.com.pp"</code>
通過以上代碼可以看到,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屬性。友善閱讀。
<code>file</code> <code>{ ‘</code><code>/tmp/readme</code><code>.txt‘:</code>
<code> </code><code>owner => root.</code>
<code> </code><code>.......</code>
Puppet指令詳解
15
16
17
18
19
20
<code>一、常用指令:</code>
<code>puppet master </code><code>#編譯配置檔案、模闆、節點的自定義插件</code>
<code>puppet agent </code><code>#用戶端程序,負責從Master擷取資料</code>
<code>puppet cert </code><code>#證書頒發,用于簽署證書</code>
<code>puppet kick </code><code>#遠端控制agent,遠端觸發puppet agent指令</code>
<code>puppet apply </code><code>#運作本地manifests</code>
<code>二、幫助:</code>
<code>puppet doc </code><code>#生成puppet文檔</code>
<code>puppet help </code><code>#顯示puppet幫助資訊</code>
<code>puppet resource </code><code>#檢視資源幫助</code>
<code>puppet describe </code><code>#資源幫助</code>
<code>puppet status </code><code>#檢視puppet狀态</code>
<code>三、子產品和不常用指令:</code>
<code>puppet module </code><code>#從puppet forge建立、安裝、查詢子產品</code>
<code>puppet device </code><code>#遠端管理網絡裝置</code>
<code>puppet inspect </code><code>#發送report報告</code>
<code>puppet filebucket </code><code>#在filebucket中檢索和存儲檔案</code>
<code>puppet queue </code><code>#隊列程序</code>
Puppet提供大量的指令來幫助我們進行有效的管理。Puppet中所有的指令都可以使用"puppet help"指令檢視。
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<code>agent </code><code>#用戶端程序,負責從Master擷取資料</code>
<code>apply </code><code>#運作本地 manifests</code>
<code>ca </code><code>#本地證書的管理</code>
<code>catalog </code><code>#編譯、儲存、檢視Puppet代碼</code>
<code>cert </code><code>#證書頒發,用于簽署證書</code>
<code>certificate </code><code>#提供通路CA憑證的管理</code>
<code>certificate_request </code><code>#管理證書請求</code>
<code>certificate_revocation_list </code><code>#管理撤銷證書的清單</code>
<code>config </code><code>#配置選項</code>
<code>describe </code><code>#管理遠端網絡裝置</code>
<code>device </code><code>#管理遠端網絡裝置</code>
<code>doc </code><code>#生成Puppet文檔</code>
<code>facts </code><code>#系統資訊檢查</code>
<code>file</code> <code>#在filebuckete中檢索和存儲檔案</code>
<code>filebucket </code><code>#在filebucket中檢索和存儲檔案</code>
<code>help </code><code>#檢視幫助</code>
<code>inspect </code><code>#發送report報告</code>
<code>instrumentation_data </code><code>#管理監聽的資料</code>
<code>instrumentation_listener </code><code>#管理監聽狀态</code>
<code>instrumentation_probe </code><code>#管理監聽探測</code>
<code>key </code><code>#建立、儲存、删除證書密鑰</code>
<code>kick </code><code>#遠端控制Agent,遠端觸發puppet agent指令</code>
<code>man</code> <code>#檢視手冊</code>
<code>master </code><code>#服務端程序</code>
<code>module </code><code>#從Puppet Forge建立、安裝、查詢子產品</code>
<code>node </code><code>#管理節點</code>
<code>parser </code><code>#解析器管理</code>
<code>plugin </code><code>#插件管理</code>
<code>queue </code><code>#隊列程序</code>
<code>report </code><code>#建立、檢視報告</code>
<code>resource </code><code>#檢視資源幫助</code>
<code>resource_type </code><code>#檢視類、預設資源類型與節點資訊</code>
<code>secret_agent </code><code>#模拟Agent</code>
<code>status </code><code>#檢視Puppet狀态</code>
1)puppet master
參數詳解如下:
<code>--daemonize: </code><code>#-D發送到背景守護程序,預設選項</code>
<code>--no-daemonize: </code><code>#不發送到背景守護程序</code>
<code>--debug: </code><code>#-d啟用完整的調試模式</code>
<code>--help: </code><code>#-h檢視幫助</code>
<code>--logdest: </code><code>#-l日志送發方式,預設采用syslog配置</code>
<code>--verbose: </code><code>#-v顯示詳細資訊</code>
<code>--version: </code><code>#-V列印Puppet版本</code>
<code>--compile: </code><code>#以JSON的方式輸出編譯的catalog</code>
--genconfig輸出預設的配置檔案,代碼如下:
<code>[root@node2 ~]</code><code># puppet master --genconfig>puppet.conf</code>
最常用的是不啟用守護程序的方式運作,用于調試Puppet代碼
2)puppet agent
puppet agent在每個節點以守護程序方式運作,通常每30分鐘向master請求一次,以确認資訊并詢問是否有變更,然後複制運作編譯好的Catalog代碼。
指令的參數詳解如下:
<code>--certname: </code><code>#指定用戶端certname(唯一ID)</code>
<code>--daemonize: </code><code>#-D發送到背景守護程序,預設選項</code>
<code>--no-daemonize: </code><code>#不發送到背景守護程序</code>
<code>--debug: </code><code>#-d啟用完整的調試模式</code>
<code>--detailed-exitcodes: </code><code>#提供詳細的退出代碼</code>
<code>--digest: </code><code>#指定證書指紋算法,預設為MD5算法</code>
<code>--disable: </code><code>#禁用,禁止puppet agent在此節點執行</code>
<code>--</code><code>enable</code><code>: </code><code>#啟用,重新允許執行puppent agent</code>
<code>--fingerpring: </code><code>#顯示目前證書的指紋</code>
<code>--logdest: </code><code>#-l 日志發送方式,預設采用syslog配置</code>
<code>--no-client: </code><code>#不要建立用戶端配置檔案,當listen=true</code>
<code>--noop: </code><code>#使用‘noop’模式,Puppet運作Catalog</code>
<code>--onetime: </code><code>#-o 運作一次,配合--no-daemonize使用</code>
<code>--server: </code><code>#啟動另一類型的服務</code>
<code>--</code><code>test</code><code>: </code><code>#-t 測試,常用選擇</code>
<code>--verbose: </code><code>#-v 顯示詳細資訊</code>
<code>--version: </code><code>#-V 列印Puppet版本</code>
<code>--waitforcert </code><code>#-w 當master未簽署此節點證書時,puppet agent 将等待簽署,并預設每2分鐘重新連接配接master以确認是否完成簽署</code>
主要指令apply
puppet apply 指令參數詳解
<code>--debug: </code><code>#啟用完整的調試模式</code>
<code>--detailed-exitcodes: </code><code>#提供詳細的退出代碼</code>
<code>--help: </code><code>#幫助</code>
<code>--loadclasses: </code><code>#加載任何已儲存類</code>
<code>--logdest: </code><code>#日志送發方式,預設采用syslog配置</code>
<code>--noop: </code><code>#使用‘noop’模式</code>
<code>--execute: </code><code>#執行指令中指定的Puppet代碼</code>
<code>--verbose: </code><code>#顯示詳細資訊</code>
<code>--catalog: </code><code>#運作puppet master采用--compile輸出JSON</code>
puppet cert :用于管理本地證書 檢視未簽名證書 簽署證書 廢除證書 清除證書
<code>clean </code><code>//</code> <code>清除 用于清除證書</code>
<code>fingerprint </code><code>//</code> <code>列印證書指紋</code>
<code>generate </code><code>//</code> <code>生成用戶端證書</code>
<code>list </code><code>//</code> <code>檢視認證用戶端清單</code>
<code>print </code><code>//</code> <code>列印主機證書的全文資訊</code>
<code>revoke </code><code>//</code> <code>廢除已認證的主機</code>
<code>sign </code><code>//</code> <code>簽署認證</code>
<code>verify </code><code>//</code> <code>驗證本地指定的認證</code>
<code>參數:</code>
<code>--all </code><code>//</code> <code>執行所有操作,包括</code><code>'sign'</code><code>,</code><code>'clean'</code><code>,</code><code>'list'</code><code>,</code><code>'fingerprint'</code>
<code>--digest </code><code>//</code> <code>設定證書指紋加密的方式,取決于openssl版本</code>
<code>--debug </code><code>//</code> <code>啟用完整的調試模式</code>
<code>--help </code><code>//</code> <code>檢視幫助</code>
<code>--verbose </code><code>//</code> <code>顯示詳細資訊</code>
<code>--version </code><code>//</code> <code>-V 列印puppet版本</code>
puppet kick :用于連接配接到agent 讓他主動運作puppet agent --test指令,主動觸發
<code>需要agent節點puppet 配置檔案字段增加 listen=</code><code>true</code>
<code>需要agent 節點防火牆允許8139端口</code>
<code>需要agent auth.conf插入配置</code>
<code> </code><code>#allow puppet kick access</code>
<code> </code><code>path </code><code>/run</code>
<code> </code><code>method save</code>
<code> </code><code>auth any</code>
<code> </code><code>allow puppet.master.domain.com</code>
<code>--all </code><code>//</code> <code>-a 指定所有主機,常用選項</code>
<code>--class </code><code>//</code> <code>-c 指定類</code>
<code>--debug </code><code>//</code> <code>-d 啟用完整的調試模式</code>
<code>--foreground </code><code>//</code> <code>-f 直到主機運作時才傳回,預設是</code><code>false</code>
<code>--help </code><code>//</code> <code>-h 檢視幫助</code>
<code>--host </code><code>//</code> <code>指定主機 常用選項</code>
<code>--ignoreschedules </code><code>//</code> <code>用戶端忽略計劃任務,但會影響效率 預設為</code><code>false</code>
<code>--parallel </code><code>//</code> <code>并發連接配接,提高效率,但會導緻master壓力增大</code>
<code>--tag </code><code>//</code> <code>-t 指定标簽</code>
<code>--</code><code>test</code> <code>//</code> <code>測試</code>
<code>--</code><code>ping</code> <code>//</code> <code>-p 對目标主機做icmp </code><code>echo</code> <code>,路過不響應的主機</code>
puppet describe : 提供資源的類型,providers 和metaparameters的幫助
<code>--help </code><code>//</code> <code>-h 檢視幫助</code>
<code>--providers </code><code>//</code> <code>-p 列出類型詳細說明</code>
<code>--list </code><code>//</code> <code>-l 列出所有類型</code>
<code>--meta </code><code>//</code> <code>-m 列出所有metaparameters</code>
<code>--short </code><code>//</code> <code>-s 僅列出參數,不顯示細節</code>
pupet resource :提供一個簽單的工具,獎系統資源轉換成puppet代碼
<code>指令參數:</code>
<code>--debug </code><code>//</code> <code>-d 啟用完整的調試模式</code>
<code>--edit </code><code>//</code> <code>-e 将查詢結果定入檔案</code>
<code>--host </code><code>//</code> <code>-H 指定要查詢的主機</code>
<code>--param </code><code>//</code> <code>-p 添加更多參數進行查詢</code>
<code>--types </code><code>//</code> <code>-t 顯示所有類型資訊</code>
<code>--verbose </code><code>//</code> <code>-</code><code>v</code> <code>顯示詳細資訊</code>
============================================================================
一些手記快速組合指令
<code>puppet cert sign agentname </code><code>//</code> <code>對agent主機進行簽名 --all 對所有等待簽名的主機授權</code>
<code>puppet cert --clean host </code><code>//</code> <code>删除host認證資訊 --all表示删除所有agent主機的證書</code>
<code>puppet cert list --all </code><code>//</code><code>指令可以檢視用戶端已經加入</code>
<code>puppet cert signagent_name </code><code>//</code><code>來簽發證書</code>
<code>puppet apply --</code><code>test</code> <code>--verbose </code><code>//</code><code>檢視用戶端申請證書的詳細過程</code>
<code>puppet doc --reference configuration </code><code>//</code> <code>配置參考手冊</code>
<code>puppet agent --configprint confdir </code><code>//</code> <code>輸出配置檔案目錄</code>
<code>puppet parser validate init.pp </code><code>//</code> <code>服務端檢查配置檔案 2.6版本中puppet --aprseonly init.pp</code>
執行個體一、将輸出資訊輸出到日志檔案
<code>[root@node1 manifests]</code><code># puppet apply -l /tmp/init.log init.pp</code>
<code>** (process:18930): WARNING **: nm_client_get_devices: error getting devices: The name org.freedesktop.NetworkManager was not provided by any .service files</code>
<code>[root@node1 manifests]</code><code># cd /tmp/</code>
<code>[root@node1 tmp]</code><code># cat init.log</code>
<code>Wed Dec 31 11:55:36 +0800 2014 Puppet (notice): Compiled catalog </code><code>for</code> <code>node1.jiabin.com </code><code>in</code> <code>environment production </code><code>in</code> <code>0.04 seconds</code>
<code>Wed Dec 31 11:55:36 +0800 2014 Puppet (notice): Finished catalog run </code><code>in</code> <code>0.01 seconds</code>
執行個體二、在用戶端運作指令
<code>[root@node2 ~]</code><code># mkdir -p /etc/puppet/modules/test/manifests</code>
<code>[root@node2 ~]</code><code># vim /etc/puppet/modules/test/manifests/init.pp</code>
<code>[root@node2 ~]</code><code># puppet apply -e "include test" --noop</code>
<code>Notice: Compiled catalog </code><code>for</code> <code>node2.jiabin.com </code><code>in</code> <code>environment production </code><code>in</code> <code>0.10 seconds</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>0.02 seconds</code>
<code>去除 --noop後可以檢視</code><code>/tmp</code><code>下生成的node2.txt檔案</code>
<code>[root@node2 ~]</code><code># puppet apply -e "include test"</code>
<code>Notice: Compiled catalog </code><code>for</code> <code>node2.jiabin.com </code><code>in</code> <code>environment production </code><code>in</code> <code>0.07 seconds</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>0.03 seconds</code>
<code>[root@node2 ~]</code><code># cd /tmp/</code>
<code>[root@node2 tmp]</code><code># ls</code>
<code>helloworld.txt node2.txt</code>
<code>[root@node2 tmp]</code><code># cat node2.txt</code>
<code>Hello World![root@node2 tmp]</code><code>#</code>
執行個體三、使用apply運作master編譯好的JSON檔案。需要在服務端使用compile參數生成JSON檔案再傳遞至用戶端執行。
1)先修改test類的内容,将"Hello World!" 修改為“Testing JSON!":
<code>[root@node1 tmp]</code><code># vim /etc/puppet/modules/test/manifests/init.pp</code>
<code>class </code><code>test</code> <code>{</code>
<code> </code><code>file</code> <code>{ </code><code>"/tmp/$hostname.txt"</code><code>: content => </code><code>"Testing JSON!"</code><code>;}</code>
本文轉自散盡浮華部落格園部落格,原文連結:http://www.cnblogs.com/kevingrace/p/5740984.html,如需轉載請自行聯系原作者