-----本文大綱
簡介
工作原理
puppet安裝及指令解析
puppet資源類型
---------------------
一、簡介
puppet是一種Linux、Unix、windows平台的集中配置管理系統,使用自有的puppet描述語言,可管理配置檔案、使用者、cron任務、軟體包、系統服務等。puppet把這些系統實體稱之為資源,puppet的設計目标是簡化對這些資源的管理以及妥善處理資源間的依賴關系。
puppet采用C/S星狀的結構,所有的用戶端和一個或幾個伺服器互動。每個用戶端周期的(預設半個小時)向伺服器發送請求,獲得其最新的配置資訊,保證和該配置資訊同步。每個puppet用戶端每半小時(可以設定)連接配接一次伺服器端, 下載下傳最新的配置檔案,并且嚴格按照配置檔案來配置伺服器. 配置完成以後,puppet用戶端可以回報給伺服器端一個消息. 如果出錯,也會給伺服器端回報一個消息.
二、工作原理
在使用任何軟體前我們都需要了解其工作原理,否則會給後續使用帶來諸多不便。Puppet采用了非常簡單的C/S架構,所有資料的互動都通過SSL進行,以保證安全
<a href="http://s3.51cto.com/wyfs02/M02/28/5E/wKioL1N4JjHQBZ8_AAHsiMGBTsg364.jpg" target="_blank"></a>
用戶端Puppetd向Master發起認證請求,或使用帶簽名的證書。
Master告訴Client你是合法的。
用戶端Puppetd調用Facter,Facter探測出主機的一些變量,例如主機名、記憶體大小、IP位址等。Puppetd将這些資訊通過SSL連接配接發送到伺服器端。
伺服器端的Puppet Master檢測用戶端的主機名,然後找到manifest對應的node配置,并對該部分内容進行解析。Facter送過來的資訊可以作為變量處 理,node牽涉到的代碼才解析,其他沒牽涉的代碼不解析。解析分為幾個階段,首先是文法檢查,如果文法錯誤就報錯;如果文法沒錯,就繼續解析,解析的結 果生成一個中間的“僞代碼”(catelog),然後把僞代碼發給用戶端。
用戶端接收到“僞代碼”,并且執行。
用戶端在執行時判斷有沒有File檔案,如果有,則向fileserver發起請求。
用戶端判斷有沒有配置Report,如果已配置,則把執行結果發送給伺服器。
伺服器端把用戶端的執行結果寫入日志,并發送給報告系統。
三、puppet安裝
1、安裝puppet
安裝ruby
1
<code>#yum install ruby ruby-libs ruby-rdoc</code>
安裝epel源
<code>#rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm</code>
安裝puppet
<code>[root@dynamic bin]</code><code># yum --enablerepo="epel,epel-puppet" install puppet</code>
2、puppet指令注解
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<code>[root@dynamic bin]</code><code># puppet help</code>
<code>Usage: puppet <subcommand> [options] <action> [options]</code>
<code>Available subcommands, from Puppet Faces:</code>
<code> </code><code>ca Local Puppet Certificate Authority management.</code>
<code>#管理本地證書</code>
<code> </code><code>catalog Compile, save, view, and convert catalogs.</code>
<code>#編譯、儲存、檢視 puppet、代碼,或轉換成 Catalogs</code>
<code> </code><code>certificate Provide access to the CA </code><code>for</code> <code>certificate management.</code>
<code>#提供通路 CA憑證的管理</code>
<code> </code><code>certificate_request Manage certificate requests.</code>
<code>#管理證書的請求</code>
<code> </code><code>certificate_revocation_list Manage the list of revoked certificates.</code>
<code> </code><code>#管理撤銷證書的清單</code>
<code> </code><code>config Interact with Puppet's configuration options.</code>
<code> </code><code>facts Retrieve and store facts.</code>
<code>#系統資訊檢查</code>
<code> </code><code>file</code> <code>Retrieve and store files </code><code>in</code> <code>a filebucket</code>
<code>#在 filebucket 中檢索和存</code>
<code>儲檔案</code>
<code> </code><code>help Display Puppet help.</code>
<code> </code><code>instrumentation_data Manage instrumentation listener accumulated data.</code>
<code>#管理監聽的資料</code>
<code> </code><code>instrumentation_listener Manage instrumentation listeners.</code>
<code>#管理監聽的狀态</code>
<code> </code><code>instrumentation_probe Manage instrumentation probes.</code>
<code> </code><code>#管理監聽探測</code>
<code> </code><code>key Create, save, and remove certificate keys. </code><code>##建立、儲存、删除證書密</code>
<code>鑰</code>
<code> </code><code>man</code> <code>Display Puppet manual pages.</code>
<code> </code><code>module Creates, installs and searches </code><code>for</code> <code>modules on the Puppet Forge. </code><code>#</code>
<code>從 Puppet Forge 建立、安裝、查詢子產品</code>
<code> </code><code>node View and manage node definitions.</code>
<code>#管理節點</code>
<code> </code><code>parser Interact directly with the parser.</code>
<code>#解析器管理,檢查 pp 檔案文法</code>
<code>plugin Interact with the Puppet plugin system.</code>
<code>#管理插件</code>
<code> </code><code>report Create, display, and submit reports.</code>
<code> </code><code>#建立、檢視報告</code>
<code> </code><code>resource API only: interact directly with resources via the RAL.</code>
<code>#檢視資源幫助</code>
<code> </code><code>resource_type View classes, defined resource types, and nodes from all manifests</code>
<code>#檢視類、預設資源類型與節點資訊</code>
<code> </code><code>secret_agent Mimics puppet agent.</code>
<code>#模拟 Agent</code>
<code>status View puppet server status.</code>
<code>#檢視 puppet 狀态</code>
<code>Available applications, soon to be ported to Faces:</code>
<code> </code><code>agent The puppet agent daemon</code>
<code>#用戶端程序,負責從 Master 端擷取資訊</code>
<code> </code><code>apply Apply Puppet manifests locally</code>
<code>#運作本地 manifests</code>
<code> </code><code>cert Manage certificates and requests</code>
<code>#證書頒發,用于簽署證書</code>
<code> </code><code>describe Display help about resource types</code>
<code>#資源幫助</code>
<code> </code><code>device Manage remote network devices</code>
<code> </code><code>#管理遠端網絡裝置</code>
<code> </code><code>doc Generate Puppet documentation and references</code>
<code>#生成 puppet 文檔</code>
<code> </code><code>filebucket Store and retrieve files </code><code>in</code> <code>a filebucket</code>
<code>#在 filebucket 中檢索和存儲檔案</code>
<code> </code><code>inspect Send an inspection report</code>
<code>#發送 report 報告</code>
<code> </code><code>kick Remotely control puppet agent</code>
<code> </code><code>#遠端控制 agent,遠端觸發 puppet agent指令</code>
<code> </code><code>master The puppet master daemon</code>
<code>#編譯配置檔案、模闆、節點的自定義插件</code>
<code> </code><code>queue Queuing daemon </code><code>for</code> <code>asynchronous storeconfigs</code>
<code>#隊列程序</code>
<code>See </code><code>'puppet help <subcommand> <action>'</code> <code>for</code> <code>help on a specific subcommand action.</code>
<code>See </code><code>'puppet help <subcommand>'</code> <code>for</code> <code>help on a specific subcommand.</code>
<code>Puppet v2.7.25</code>
puppet master :編譯配置檔案、模闆、節點的自定義插件
<code>[root@dynamic bin]</code><code># puppet help master</code>
<code> </code>
<code>puppet-master(8) -- The puppet master daemon</code>
<code>========</code>
<code>SYNOPSIS</code>
<code>--------</code>
<code>The central puppet server. Functions as a certificate authority by</code>
<code>default.</code>
<code>USAGE</code>
<code>-----</code>
<code>puppet master [-D|--daemonize|--no-daemonize] [-d|--debug] [-h|--help]</code>
<code> </code><code>[-l|--logdest <</code><code>file</code><code>>|console|syslog] [-</code><code>v</code><code>|--verbose] [-V|--version]</code>
<code> </code><code>[--compile <node-name>]</code>
<code>DESCRIPTION</code>
<code>-----------</code>
<code>This </code><code>command</code> <code>starts an instance of puppet master, running as a daemon</code>
<code>and using Ruby's built-</code><code>in</code> <code>Webrick webserver. Puppet master can also be</code>
<code>managed by other application servers; when this is the </code><code>case</code><code>, this</code>
<code>executable is not used.</code>
<code> </code><code>-D|--daemonize </code><code>#發送到背景守護程序,預設選項</code>
<code>--no-daemonize </code><code>#不發送到背景守護程序</code>
<code>-d|--debug </code><code>#啟用完整的調試模式</code>
<code>-h|--help </code><code>#檢視幫助</code>
<code>-l|--logdest <</code><code>file</code><code>>|console|syslog </code><code>#日志發送方式,預設采用 syslog 配置</code>
<code>-</code><code>v</code><code>|--verbose </code><code>#顯示詳細資訊</code>
<code>-V|--version </code><code>#列印 puppet 版本</code>
<code>--compile <node-name> </code><code>#以 JSON 的方式輸出編譯的 catalog</code>
<code>--genconfig </code><code>#輸入預設配置檔案</code>
puppet agent :用戶端程序,負責從 Master 擷取資料
74
75
<code>[root@dynamic bin]</code><code># puppet help agent</code>
<code> </code>
<code>puppet-agent(8) -- The puppet agent daemon</code>
<code>Retrieves the client configuration from the puppet master and applies it to</code>
<code>the </code><code>local</code> <code>host.</code>
<code>This service may be run as a daemon, run periodically using </code><code>cron</code> <code>(or something</code>
<code>similar), or run interactively </code><code>for</code> <code>testing purposes.</code>
<code>puppet agent [--certname <name>] [-D|--daemonize|--no-daemonize]</code>
<code> </code><code>[-d|--debug] [--detailed-exitcodes] [--digest <digest>] [--disable] [--</code><code>enable</code><code>]</code>
<code> </code><code>[--fingerprint] [-h|--help] [-l|--logdest syslog|<</code><code>file</code><code>>|console]</code>
<code> </code><code>[--no-client] [--noop] [-o|--onetime] [--serve <handler>] [-t|--</code><code>test</code><code>]</code>
<code> </code><code>[-</code><code>v</code><code>|--verbose] [-V|--version] [-w|--waitforcert <seconds>]</code>
<code>This is the main puppet client. Its job is to retrieve the </code><code>local</code>
<code>machine's configuration from a remote server and apply it. In order to</code>
<code>successfully communicate with the remote server, the client must have a</code>
<code>certificate signed by a certificate authority that the server trusts;</code>
<code>the recommended method </code><code>for</code> <code>this, at the moment, is to run a certificate</code>
<code>authority as part of the puppet server (</code><code>which</code> <code>is the default). The</code>
<code>client will connect and request a signed certificate, and will </code><code>continue</code>
<code>connecting </code><code>until</code> <code>it receives one.</code>
<code>Once the client has a signed certificate, it will retrieve its</code>
<code>configuration and apply it.</code>
<code>--certname <name></code>
<code>#指定用戶端 certname(唯一 ID),通常以 FQDN 命名</code>
<code>--daemonize</code>
<code>#發送到背景守護程序,預設選項</code>
<code>--no-daemonize</code>
<code>#不發送到背景守護程序</code>
<code>-d|--debug</code>
<code> </code><code>#啟用完整的調試模式</code>
<code>--detailed-exitcodes</code>
<code>#提供詳細的退出代碼</code>
<code>--digest <digest></code>
<code>#指定證書指紋算法,預設為 MD5 算法</code>
<code>--disable</code>
<code> </code><code>#禁用,禁止 puppet agent 在此節點運作</code>
<code>--</code><code>enable</code>
<code>#啟用,重新運作執行 puppet agent</code>
<code>--fingerprint</code>
<code> </code><code>#顯示目前證書的指紋</code>
<code>-h|--help</code>
<code>#檢視幫助</code>
<code>-l|--logdest syslog|<</code><code>file</code><code>>|console</code>
<code>#日志發送方式,預設采用 syslog 配置</code>
<code>--no-client</code>
<code> </code><code>#不建立用戶端配置檔案,當 listen=true 時才有意義</code>
<code>--noop</code>
<code>#puppet 運作 Catalog,但不執行配置</code>
<code>-o|--onetime</code>
<code>#運作一次,配合--no-daemonize 使用</code>
<code>--serve <handler></code>
<code>#啟動另一類的服務</code>
<code>-t|--</code><code>test</code>
<code> </code><code>#測試用,包含了('onetime','verbose', 'ignorecache', 'no-daemonize', 'no-usecacheonfailure','detailed-exit-codes', 'no-splay', and 'show_diff')</code>
<code>-</code><code>v</code><code>|--verbose</code>
<code> </code><code>#顯示詳細資訊</code>
<code>-V|--version</code>
<code>#列印 puppet 版本</code>
<code>-w|--waitforcert <seconds></code>
<code> </code><code>#當 Master 未簽署此節點證書時,puppet agent 将等待簽署,并預設</code>
<code>#每 2 分鐘重新連接配接 Master 以确定是否完成簽署</code>
puppet cert :證書頒發,用于簽署證書
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<code>[root@dynamic bin]</code><code># puppet help cert</code>
<code>puppet-cert(8) -- Manage certificates and requests</code>
<code>Standalone certificate authority. Capable of generating certificates,</code>
<code>but mostly used </code><code>for</code> <code>signing certificate requests from puppet clients.</code>
<code>puppet cert <action> [-h|--help] [-V|--version] [-d|--debug] [-</code><code>v</code><code>|--verbose]</code>
<code> </code><code>[--digest <digest>] [<host>]</code>
<code>Because the puppet master service defaults to not signing client</code>
<code>certificate requests, this script is available </code><code>for</code> <code>signing outstanding</code>
<code>requests. It can be used to list outstanding requests and </code><code>then</code> <code>either</code>
<code>sign them individually or sign all of them.</code>
<code>ACTIONS</code>
<code>-------</code>
<code>Every action except </code><code>'list'</code> <code>and </code><code>'generate'</code> <code>requires a </code><code>hostname</code> <code>to act on,</code>
<code>unless the </code><code>'--all'</code> <code>option is </code><code>set</code><code>.</code>
<code>* clean:</code>
<code>#清除,用于清除證書</code>
<code> </code><code>Revoke a host's certificate (</code><code>if</code> <code>applicable) and remove all files</code>
<code> </code><code>related to that host from puppet cert's storage. This is useful when</code>
<code> </code><code>rebuilding hosts, since new certificate signing requests will only be</code>
<code> </code><code>honored </code><code>if</code> <code>puppet cert does not have a copy of a signed certificate</code>
<code> </code><code>for</code> <code>that host. If </code><code>'--all'</code> <code>is specified </code><code>then</code> <code>all host certificates,</code>
<code> </code><code>both signed and unsigned, will be removed.</code>
<code>* fingerprint:</code>
<code>#列印證書指紋</code>
<code> </code><code>Print the DIGEST (defaults to md5) fingerprint of a host's</code>
<code> </code><code>certificate.</code>
<code>* generate:</code>
<code>#生成用戶端證書</code>
<code> </code><code>Generate a certificate </code><code>for</code> <code>a named client. A certificate</code><code>/keypair</code> <code>will</code>
<code> </code><code>be generated </code><code>for</code> <code>each client named on the </code><code>command</code> <code>line.</code>
<code>* list:</code>
<code>#檢視認證用戶端清單</code>
<code> </code><code>List outstanding certificate requests. If </code><code>'--all'</code> <code>is specified, signed</code>
<code> </code><code>certificates are also listed, prefixed by </code><code>'+'</code><code>, and revoked or invalid</code>
<code> </code><code>certificates are prefixed by </code><code>'-'</code> <code>(the verification outcome is printed</code>
<code> </code><code>in</code> <code>parenthesis).</code>
<code>* print:</code>
<code>#列印主機證書的全文資訊</code>
<code> </code><code>Print the full-text version of a host's certificate.</code>
<code>* revoke:</code>
<code>#廢除已認證的主機</code>
<code> </code><code>Revoke the certificate of a client. The certificate can be specified either</code>
<code> </code><code>by its serial number (given as a hexadecimal number prefixed by </code><code>'0x'</code><code>) or by its</code>
<code> </code><code>hostname</code><code>. The certificate is revoked by adding it to the Certificate Revocation</code>
<code> </code><code>List given by the </code><code>'cacrl'</code> <code>configuration option. Note that the puppet master</code>
<code> </code><code>needs to be restarted after revoking certificates.</code>
<code>* sign:</code>
<code>#簽署認證</code>
<code> </code><code>Sign an outstanding certificate request.</code>
<code>* verify:</code>
<code>#驗證本地指定的認證</code>
<code> </code><code>Verify the named certificate against the </code><code>local</code> <code>CA certificate.</code>
<code>OPTIONS</code>
<code>Note that any configuration parameter that's valid </code><code>in</code> <code>the configuration</code>
<code>file</code> <code>is also a valid long argument. For example, </code><code>'ssldir'</code> <code>is a valid</code>
<code>configuration parameter, so you can specify </code><code>'--ssldir <directory>'</code> <code>as an</code>
<code>argument.</code>
<code>See the configuration </code><code>file</code> <code>documentation at</code>
<code>http:</code><code>//docs</code><code>.puppetlabs.com</code><code>/references/stable/configuration</code><code>.html </code><code>for</code> <code>the</code>
<code>full list of acceptable parameters. A commented list of all</code>
<code>configuration options can also be generated by running puppet cert with</code>
<code>'--genconfig'</code><code>.</code>
<code>* --all:</code>
<code> </code><code>#執行所有操作,包括'sign','clean','list','fingerprint',</code>
<code> </code><code>Operate on all items. Currently only makes sense with the </code><code>'sign'</code><code>,</code>
<code> </code><code>'clean'</code><code>, </code><code>'list'</code><code>, and </code><code>'fingerprint'</code> <code>actions.</code>
<code>* --digest:</code>
<code>#設定證書指紋加密的方式,取決于 openssl 版本</code>
<code> </code><code>Set the digest </code><code>for</code> <code>fingerprinting (defaults to md5). Valid values</code>
<code> </code><code>depends on your openssl and openssl ruby extension version, but should</code>
<code> </code><code>contain at least md5, sha1, md2, sha256.</code>
<code>* --debug:</code>
<code>#啟用完整的調試模式</code>
<code> </code><code>Enable full debugging.</code>
<code>* --help:</code>
<code> </code><code>#檢視幫助</code>
<code> </code><code>Print this help message</code>
<code>* --verbose:</code>
<code>#顯示詳細資訊</code>
<code> </code><code>Enable verbosity.</code>
<code>* --version:</code>
<code>#顯示版本</code>
<code> </code><code>Print the puppet version number and </code><code>exit</code><code>.</code>
puppet apply :運作本地 manifests
<code>[root@dynamic bin]</code><code># puppet help apply</code>
<code>puppet-apply(8) -- Apply Puppet manifests locally</code>
<code>Applies a standalone Puppet manifest to the </code><code>local</code> <code>system.</code>
<code>puppet apply [-h|--help] [-V|--version] [-d|--debug] [-</code><code>v</code><code>|--verbose]</code>
<code> </code><code>[-e|--execute] [--detailed-exitcodes] [-l|--logdest <</code><code>file</code><code>>]</code>
<code> </code><code>[--apply <catalog>] [--catalog <catalog>] <</code><code>file</code><code>></code>
<code>#顯示版本資訊</code>
<code>-e|--execute</code>
<code>#執行指令中指定的 puppet 代碼</code>
<code>-l|--logdest <</code><code>file</code><code>></code>
<code> </code><code>#日志發送方式,預設采用 syslog 配置</code>
<code>--catalog <catalog></code>
<code>#運作 puppet master 采用--compile 輸出 JSON 代碼</code>
puppet kick #遠端控制 agent,遠端觸發 puppet agent 指令
3、幫助
<code>puppet doc</code>
<code>puppet help</code>
<code> </code><code>#顯示 puppet 幫助資訊</code>
<code>puppet resource</code>
<code>puppet describe</code>
<code>puppet status</code>
四、常用的核心資源( puppet describe -l)
在定義資源時,資源類型必須使用小寫字元,資源名稱僅是一個字元串,但要求在同一個類型中的其必須惟一.
如,可以同時存在名為niginx的"service"和"package"資源,但在"package"類型資源中隻能有一個名為"nginx"
puppet resouce 指令可用于互動式查找及修改puppet資源
資源定義格式:
type {'title':
key =>values,
........
}
1、package
puppet支援使用的軟體包管理器:
yum,rpm,apt,ports,gem,msi,dpkg,pkg等
package 常用參數
ensure:程式包目标狀态
ensure => {present|installed|absent|latest|purged|"version"}
=> present|installed, 檢查檔案是否存在,不存在則建立之
=> absent, 無其他軟體依賴,可删除,否則會報錯。
=> latest, 檢查檔案是否為最新版本,否則更新為最新版本
=> purged, 删除該包包括所有依賴的包,有風險慎用
=> "2.7.21-1", 指定某一個版本處于安裝狀态
name:資源的名稱,即軟體包的名字(預設與 title 相同可不寫)
source :指定程式封包件路徑
provider:軟體包括管理器(注:如通過 rpm 指令安裝包,需要通過 source 指定安裝那些包)
install_options :安裝選項,最常的用是通過INSTALLDIR指定安裝目錄
例:安裝haproxy
<code>[root@essun tmp]</code><code># rpm -q haproxy</code>
<code>package haproxy is not installed</code>
<code>[root@essun tmp]</code><code># cat haproxy_setup.pp</code>
<code>package {</code><code>'haproxy'</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code> </code><code>name => haproxy</code>
<code>}</code>
<code>[root@essun tmp]</code><code># puppet apply haproxy_setup.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Package</code><code>[haproxy]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>16.53 seconds</code>
<code>haproxy-1.4.24-2.el6.x86_64</code>
2、service :管理服務
ensure:服務的目标狀态,true|false|running|stopped
enable :是否開機自動啟動
enable => true|false 指定服務是否開機自啟動(修改 chkconfig 部分),并非對所有均有效
name: 服務名稱
name => "service name",該資源的 namevar, 服務的名字,通常就是在/etc/init.d/目錄下的名字,預設與 title 相同
path:腳本路徑
path => "/etc/rc.d/init.d", 啟動腳本的搜尋路徑,可以用冒号分割多個路徑,或者用數組指定
start :是否啟動服務
stop:是否停止服務
restart:是否重新開機服務
restart => true |false, 指出管理腳本是否支援 restart 參數,如果不支援,就用 stop 和 start實作 restart 效果.
status:判斷服務是否已經在運作
status => true|false, 指出管理腳本是否支援 status 參數,puppet 用 status 參數來判斷服務是否已經在運作了,如果不支援 status 參數,puppet 利用查找運作程序清單裡面是否有服務名來判斷服務是否在運作
例:啟動haproxy
<code>[root@essun tmp]</code><code># cat haproxy_setup.pp</code>
<code>service {</code><code>'haproxy'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code> </code><code>name => haproxy,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code>
<code>[root@essun tmp]</code><code># puppet apply haproxy_setup.pp -v</code>
<code>info: Applying configuration version </code><code>'1400171155'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Service</code><code>[haproxy]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>9.21 seconds</code>
<code>[root@essun tmp]</code><code># chkconfig --list haproxy</code>
<code>haproxy 0:off 1:off 2:on 3:on 4:on 5:on 6:off</code>
3、file:管理檔案,目錄,符号連結
生成檔案内容、管理檔案權限、屬性
通過source屬性到指定位置下載下傳檔案
通過recurse屬性來擷取目錄
常用屬性
ensure => {present|absent|directory|file|link}, 指定檔案的目标狀态
=> present, 檢查檔案是否存在,不存在則建立之
=> absent, 檢查檔案是否存在,存在則删除之
=> directory, 指定這是一個目錄,不存在則建立
backup:通過filebucket資源備份檔案,值通常為filebucket資源名稱
content:檔案内容:生成方式有三種(content,source,target),彼此互斥
content => "hello",|content => template("postfix/main.cf.erb"), 檔案的具體内容,亦可由 erb 模闆生成,選擇這個可不寫資源 source
source:通過指定的url下載下傳檔案至本地,擷取方式通常為puppet url,格式為puppet:///modules/MODULE_NAME/file_name;
target:為符号連結指定目标
links:檔案為符号連結{follow|manage}
path:檔案路徑,必須使用雙引号;
path => "/etc/postfix/main.cf", 檔案完整路徑。預設與 title 相同可不寫
mode:定義權限
mode => 0644, 權限屬性,四位八進制數
owner:屬主
owner|user => root, 所屬使用者,也可以用 UID
group:屬組
group => puppet, 所屬使用者組,也可以用 GID
force:強制執行删除檔案、連結或目錄;僅用于ensure為absent時:
purge:清空指定目錄中存在的,但未在資源中定義的檔案。
recurse:目錄遞歸
recurse => '{true|false|inf|remote}', 對目錄是(true)否(false)遞歸(ensure =>directory 時有效)
replace:替換,本地存在的檔案與資源中指定的檔案内容不同時,是否執行替換,預設為否
例:
<code>[root@dynamic tmp]</code><code># mkdir -pv /tmp/dir1/{dir2,dir3,dir4}</code>
<code>mkdir</code><code>: created directory `</code><code>/tmp/dir1</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/tmp/dir1/dir2</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/tmp/dir1/dir3</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/tmp/dir1/dir4</code><code>'</code>
<code>[root@dynamic tmp]</code><code># cat mkdir.pp</code>
<code>file</code><code>{ </code><code>"/tmp/dir1"</code><code>:</code>
<code>owner => </code><code>"puppet"</code><code>,</code>
<code>group => </code><code>"puppet"</code><code>,</code>
<code>mode => 0700,</code>
<code>ensure => directory,</code>
<code>recurse => </code><code>true</code><code>,</code>
<code>purge => </code><code>true</code><code>,</code>
<code>force => </code><code>true</code><code>,</code>
<code>ignore => </code><code>"dir2"</code><code>,</code>
<code>[root@dynamic tmp]</code><code># puppet apply mkdir.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/tmp/dir1</code><code>]</code><code>/owner</code><code>: owner changed </code><code>'root'</code> <code>to </code><code>'puppet'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/tmp/dir1</code><code>]</code><code>/group</code><code>: group changed </code><code>'root'</code> <code>to </code><code>'puppet'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/tmp/dir1</code><code>]</code><code>/mode</code><code>: mode changed </code><code>'0755'</code> <code>to </code><code>'0700'</code>
<code>notice: </code><code>/File</code><code>[</code><code>/tmp/dir1/dir4</code><code>]</code><code>/ensure</code><code>: removed</code>
<code>notice: </code><code>/File</code><code>[</code><code>/tmp/dir1/dir3</code><code>]</code><code>/ensure</code><code>: removed</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.06 seconds</code>
<code>[root@dynamic tmp]</code><code># ll -d dir1/</code>
<code>drwx------ 3 puppet puppet 4096 May 18 14:29 dir1/</code>
<code>[root@dynamic dir1]</code><code># ll</code>
<code>total 4</code>
<code>drwxr-xr-x 2 root root 4096 May 18 14:28 dir2</code>
4、exec :執行外部指令,通常用于完成puppet自身無法完成的功能
常用屬性
command :要執行的指令,通常為指令檔案的完整路徑
path:指令搜尋路徑.(如果path 沒有被定義,指令需要使用絕對路徑。路徑可以以數組或以冒号分隔的形式來定義。)
user:定義運作指令的使用者
group:定義運作指令的使用者組
onlyif:0,表示僅在指令的狀态傳回值為0時才執行此指令。
refresh:接收到其它資源的通知時,如何重新執行此指令
refreshonly:僅當被依賴的資源發生改變時才被觸發
tries:嘗試的次數,預設為1;
try_sleep:多次嘗試之間的時間間隔
例
<code>[root@dynamic tmp]</code><code># cat temp.pp</code>
<code>exec</code> <code>{</code><code>'echo temp'</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>'mktemp /tmp/tmp.XXX'</code><code>,</code>
<code> </code><code>path => [ </code><code>"/bin"</code><code>,</code><code>"/sbin"</code><code>,</code><code>"/usr/bin"</code><code>,</code><code>"/usr/sbin"</code> <code>],</code>
<code>[root@dynamic tmp]</code><code># puppet apply temp.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[</code><code>echo</code> <code>temp]</code><code>/returns</code><code>: executed successfully</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.10 seconds</code>
<code>[root@dynamic tmp]</code><code># ll</code>
<code>total 12</code>
<code>drwx------ 3 puppet puppet 4096 May 18 14:29 dir1</code>
<code>srwxrwxrwx 1 mysql mysql 0 May 4 14:19 maria.sock</code>
<code>-rw-r--r-- 1 root root 166 May 18 14:24 </code><code>mkdir</code><code>.pp</code>
<code>-rw-r--r-- 1 root root 111 May 18 15:09 temp.pp</code>
<code>-rw------- 1 root root 0 May 18 15:09 tmp.ZeW</code>
資源引用:
在引用時,"Type"首字母必須大寫,如:Package ['nginx']
元參數:用于定義資源間依賴關系及應用次序。
通知機制:應用産生的消息
特殊屬性
notify:調試輸出
常用參數
message :資訊内容
name :消息名稱
<code>[root@dynamic tmp]</code><code># cat messages.pp</code>
<code>file</code> <code>{</code><code>'/tmp/messages.txt'</code><code>:</code>
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>content =></code><code>"hello puppet!"</code><code>,</code>
<code> </code><code>notify => Exec[</code><code>'messages'</code><code>]</code>
<code>exec</code> <code>{</code><code>'messages'</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>'echo "/tmp/message.txt" >> /tmp/message.txt'</code><code>,</code>
<code> </code><code>refreshonly =></code><code>true</code><code>,</code>
<code> </code><code>path => </code><code>"/bin/:/sbin/:/usr/bin:/usr/sbin"</code>
<code>[root@dynamic tmp]</code><code># puppet apply messages.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/tmp/messages</code><code>.txt]</code><code>/content</code><code>: content changed </code><code>'{md5}e147509e8f852facd239743193e249c2'</code> <code>to </code><code>'{md5}d007288adc523f44584e631abde90137'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[messages]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.21 seconds</code>
<code>[root@dynamic tmp]</code><code># cat message.txt</code>
<code>/tmp/message</code><code>.txt</code>
<code>[root@dynamic tmp]</code><code># cat messages.txt</code>
<code>hello puppet!</code>
<code>[root@dynamic tmp]</code><code>#</code>
subscribe:主動關注所關聯的資源的變化
<code> </code><code>content =></code><code>"how are you"</code><code>,</code>
<code> </code><code>command</code> <code>=> </code><code>'echo "/tmp/messages.txt changed" >> /tmp/message.txt'</code><code>,</code>
<code> </code><code>subscribe => File[</code><code>'/tmp/messages.txt'</code><code>],</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[messages]</code><code>/returns</code><code>: executed successfully</code>
<code>how are you</code>
<code>/tmp/messages</code><code>.txt changed</code>
require:必須依賴于那一個資源
<code>[root@dynamic tmp]</code><code># cat ha_setup.pp</code>
<code>package{</code><code>'haproxy'</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code> </code><code>before => Service[</code><code>'haproxy'</code><code>],</code>
<code>file</code><code>{</code><code>'/etc/haproxy/haproxy.cfg'</code><code>:</code>
<code> </code><code>source</code><code>=></code><code>'/tmp/haproxy.cfg'</code><code>,</code>
<code> </code><code>owner=></code><code>'root'</code><code>,</code>
<code> </code><code>group=></code><code>'root'</code><code>,</code>
<code> </code><code>mode=></code><code>'640'</code><code>,</code>
<code> </code><code>require=>Package[</code><code>'haproxy'</code><code>],</code>
<code>service{</code><code>'haproxy'</code><code>:</code>
<code> </code><code>ensure=>running,</code>
<code> </code><code>enable</code><code>=></code><code>true</code><code>,</code>
<code>[root@dynamic tmp]</code><code># puppet apply ha_setup.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/etc/haproxy/haproxy</code><code>.cfg]</code><code>/mode</code><code>: mode changed </code><code>'0644'</code> <code>to </code><code>'0640'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>24.91 seconds</code>
<code>[root@dynamic tmp]</code><code># ll /etc/haproxy/</code>
<code>-rw-r----- 1 root root 3142 Jul 10 2013 haproxy.cfg</code>
<code>[root@dynamic tmp]</code><code># service haproxy status</code>
<code>haproxy (pid 6266) is running...</code>
說明,package 資源屬性一定要在service 之前應用,如果package沒有應用成功,那麼service 資源将不會被應用。
before:file資源一定要在service 資源之前執行
應用鍊次序鍊與通知鍊
->用于定義次序鍊
~>用于定義通知鍊
<code> </code><code>notify=>Exec[</code><code>'monitor'</code><code>]</code>
<code> </code><code>restart =></code><code>'/etc/rc.d/init.d/haproxy reload'</code>
<code>exec</code><code>{</code><code>'monitor'</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>'echo "/tmp/haproxy.cfg己經重載" >> /tmp/hainfo.txt'</code><code>,</code>
<code> </code><code>path => </code><code>"/bin:/sbin:/usr/sbin:/usr/bin"</code>
<code>Package[</code><code>'haproxy'</code><code>]->File[</code><code>'/etc/haproxy/haproxy.cfg'</code><code>]->Exec[</code><code>'monitor'</code><code>]~>Service[</code><code>'haproxy'</code><code>]</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/etc/haproxy/haproxy</code><code>.cfg]</code><code>/content</code><code>: content changed </code><code>'{md5}c6e95eb3da150a74e6c8c2e70488083e'</code> <code>to </code><code>'{md5}1f337186b0e1ba5ee82760cb437fb810'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[monitor]</code><code>/returns</code><code>: executed successfully</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[monitor]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.90 seconds</code>
<code>[root@dynamic tmp]</code><code># cat hainfo.txt</code>
<code>/tmp/haproxy</code><code>.cfg己經重載</code>
5、group: 系統上使用者組
ensure:目标狀态,present,absent
name:組名
gid:組ID
system:系統組
6、user:系統上使用者
ensure:目标狀态
name:使用者名
uid:使用者ID
system:系統使用者
gid:組名或組ID
home:使用者的家目錄。必須是己建立的目錄,如果沒有建立,則不檢查
shell:指定其shell
password:指定使用者密碼
mangehome: 是否建立家目錄。true or false
<code>[root@dynamic tmp]</code><code># cat useradd.pp</code>
<code>group {</code><code>'groupadd'</code><code>:</code>
<code> </code><code>ensure =>present,</code>
<code> </code><code>gid =>1010,</code>
<code> </code><code>name =>essun,</code>
<code>}-></code>
<code>user {</code><code>'useradd'</code><code>:</code>
<code> </code><code>uid =>1010,</code>
<code> </code><code>shell =></code><code>"/bin/bash"</code><code>,</code>
<code> </code><code>home =></code><code>"/home/essun"</code><code>,</code>
<code> </code><code>managehome =></code><code>true</code><code>,</code>
<code> </code><code>password =></code><code>'$1$wvZ8j1$mPa3IT.9vTdCb6sOuvdeu/'</code>
<code> </code>
<code>[root@dynamic tmp]</code><code># puppet apply useradd.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Group</code><code>[groupadd]</code><code>/ensure</code><code>: created</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//User</code><code>[</code><code>useradd</code><code>]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.50 seconds</code>
<code>[root@dynamic tmp]</code><code># su essun</code>
<code>[essun@dynamic tmp]$ </code><code>whoami</code>
<code>essun</code>
<code>[essun@dynamic tmp]$ </code><code>cd</code>
<code>[essun@dynamic ~]$ </code><code>pwd</code>
<code>/home/essun</code>
<code>[essun@dynamic ~]$ </code><code>id</code> <code>essun</code>
<code>uid=1010(essun) gid=1010(essun) </code><code>groups</code><code>=1010(essun)</code>
7、notify:調試輸出
常用參數
message :資訊
name
notify {'notice': message => '/etc/fstab changed',}
8、cron :管理 cron
ensure :目标狀态(present)
command:執行的指令
environment:運作時的環境變量
hour:小時
minute :分鐘
month:月份
monthday:日
weekday 周
name:名字
user: 運作此周期性任務計劃的使用者,如果沒有指出,預設為root
<code>[root@dynamic tmp]</code><code># cat cron.pp</code>
<code>cron</code> <code>{</code><code>'ntpdate'</code><code>:</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>command</code> <code>=> </code><code>'/usr/sbin/ntpdate cn.poolntp.org &> /dev/null'</code><code>,</code>
<code> </code><code>minute => </code><code>'*/5'</code><code>,</code>
<code>[root@dynamic tmp]</code><code># puppet apply cron.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Cron</code><code>[ntpdate]</code><code>/ensure</code><code>: created</code>
<code>[root@dynamic tmp]</code><code># date</code>
<code>Sun May 18 17:42:21 CST 2014</code>
<code></code>
本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1413244,如需轉載請自行聯系原作者