在學習Puppet語法之前需要掌握Puppet中資源、屬性、類、模塊、變量、參數、節點等相關概念。
資源:資源可以是文件、服務、軟件包、自定義腳本等。
屬性:資源需要定義相關的屬性值,否則毫無意義。
類:將多個資源組織起來進行重新定義。
模塊:多個類的合集。
變量:Puppet與其他語言類似,同樣支持變量。
參數:又稱參變量。
節點:Puppet每一個客戶端,即主機(Host)。
資源:
每個資源的定義都具有標題、類型,以及一系列的屬性。每個資源在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
三、資源
資源名
資源名採用單引號('')引起來,採用冒號(:)結尾。也可以使用(“”)的寫法
package {'openssh': ensure => present }
package {"openssh": ensure => present }
2.對齊
3.屬性的順序
聲明資源時,應先定義ensure屬性。方便閱讀。
file { '/tmp/readme.txt': ensure => file, owner => root. ....... }
四、Puppet命令詳解
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狀態
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 ag ent將等待簽署,並默認沒2分鐘重新連接Maste r以確認是否完成簽署
主要命令apply
puppet apply 命令參數詳解
*--debug: #啓用完整的調試模式 *--detailed-exitcodes: #提供詳細的退出代碼 *--help: #幫助 *--loadclasses: #加載任何已保存類 *--logdest: #日誌送發方式,默認採用syslog配置 *--noop: #使用'noop’模式 *--execute: #執行命令中指定的Puppet代碼 *--verbose: #顯示詳細信息 *--catalog: #運行puppet master採用--compile輸出JSON
實例一、將輸出信息輸出到日誌文件
[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文件,代碼如下:
# puppet apply --catalog node2.jiabin.com.json