Puppet代碼的規範
puppet對agent的配置清單主要集中在manifests和modules兩個目錄中,manifests和modules目錄中清單代碼檔案的符号間距、縮進與空白的使用規範.
*.pp檔案
建議使用兩個空格的軟标簽.
不推薦使用制表符.
尾部不要包含空格.
建議單行不要超過80個字元的寬度.
在資源的屬性中,通過=>符号進行屬性對齊。
注釋
puppet的注釋目前支援兩種風格:
一種shell腳本風格."#"
1
2
3
4
<code> </code><code>#this is test </code>
<code> </code><code>package {</code><code>"httpd"</code><code>:</code>
<code> </code><code>ensure=> present,</code>
<code> </code><code>}</code>
另一種C語言風格以/*開始,*/結束的多行注釋,不支援//注釋.
5
6
<code> </code><code>/* </code>
<code> </code><code>this is </code><code>test</code>
<code> </code><code>*/</code>
變量規範:
變量隻包含字母[a-z][A-Z]、數字[0-9]和下劃線(_)。
正确:
<code> </code><code>$conten_test=lisi</code>
錯誤:
<code> </code><code>$conten-</code><code>test</code><code>=lisi</code>
'',"",{}等符号,在不包含變量的字元串中都應該使用‘’進行引用;如果字元串中包含變量則通過""進行引用;如果字元串中既有變量又有字元串,可以通過{}進行引用.
正确:
<code> </code><code>/etc/</code><code>${</code><code>file</code><code>}.conf </code>
<code> </code><code>"${::operatingssytem} is not supported by ${module_name}"</code>
不推薦:(這樣寫也正确,官方不推薦)
<code> </code><code>/etc/</code><code>${</code><code>file</code><code>}.conf</code>
<code> </code><code>"$::operatingssytem is not supported by $module_name"</code>
變量被引用時不加""。(我之前代碼都加的有,官方不推薦)
<code> </code><code>mode => $mode</code>
不推薦:
<code> </code><code>mode => </code><code>"$mode"</code>
<code> </code><code>mode => </code><code>"${mode}"</code>
資源規範:
資源的标題需要用單引号''或雙引号""引起來,同時标題中不能包含空格和連字元.
資源标題:
推薦:
<code> </code><code>package {</code><code>"httpd"</code><code>: </code>
<code> </code><code>package {</code><code>'httpd'</code><code>:</code>
<code> </code><code>package {httpd: </code>
資源符号對齊:
推薦:
<code> </code><code>owner=> root,</code>
資源屬性順序:
<code> </code><code>ensure=> present,</code><code>#ensure優先放在前面.</code>
資源關系:
資源應該由邏輯關系被劃分為一組,而非通過資源類型劃分.
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<code>class nginx {</code>
<code> </code><code>package {</code><code>"nginx"</code><code>:</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>}</code>
<code> </code><code>service {</code><code>"nginx"</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code> </code><code>require => Package[</code><code>'nginx'</code><code>], </code><code>#引用依賴首字母要大寫</code>
<code> </code><code>}</code>
<code>class httpd { </code>
<code> </code><code>service {</code><code>"httpd"</code><code>:</code>
<code> </code><code>require => Package[</code><code>'httpd'</code><code>], </code><code>#引用依賴首字母要大寫</code>
不推薦:
21
<code> </code><code>class package {</code>
<code> </code><code>package {</code><code>"httpd"</code><code>:</code>
<code> </code>
<code> </code><code>class service { </code>
軟連接配接
通過file資源建立軟連接配接的時候,需要設定ensure => link,并通過target屬性來指定目标檔案.
<code> </code><code>file</code> <code>{</code><code>"/tmp/3.pp"</code><code>:</code><code>#軟連接配接檔案.(目标檔案) </code>
<code> </code><code>ensure=> link,</code>
<code> </code><code>target=> </code><code>'/root/3.pp'</code><code>,</code><code>#源檔案.</code>
注釋:/root/3.pp檔案,我想軟連接配接到/tmp下.
正确寫法:
<code> </code><code>[root@sh-web1 ~]</code><code># cat link.pp </code>
<code> </code><code>file</code> <code>{</code><code>"/tmp/3.pp"</code><code>:</code>
<code> </code><code>target=> </code><code>'/root/3.pp'</code><code>,</code>
錯誤寫法:
<code> </code><code>file</code> <code>{</code><code>"/tmp/3.pp"</code><code>: </code>
agent本地應用*.pp檔案:
<code>[root@sh-web1 ~]</code><code># puppet apply link.pp </code>
<code>Notice: Compiled catalog </code><code>for</code> <code>sh-web1.localdomain </code><code>in</code> <code>environment production </code><code>in</code> <code>0.07 seconds</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Main/File</code><code>[</code><code>/tmp/3</code><code>.pp]</code><code>/ensure</code><code>: created</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>0.02 seconds</code>
<code>[root@sh-web1 ~]</code><code># ls /tmp/</code>
<code>3.pp yum_save_tx-2017-09-22-17-52B5ZM81.yumtx yum_save_tx-2017-09-26-02-00w5fKzh.yumtx</code>
<code>text.txt yum_save_tx-2017-09-22-17-52b9CPEA.yumtx yum_save_tx-2017-09-26-18-03lhfm3k.yumtx</code>
檢視軟連接配接檔案的内容:
<code>[root@sh-web1 ~]</code><code># cat /tmp/3.pp </code>
<code>$package = [</code><code>'php'</code><code>,</code><code>'php-devel'</code><code>]</code>
<code> </code><code>class nginx {</code>
<code> </code><code>$packages += [</code><code>'php-pecl-geoip'</code><code>]</code>
<code> </code><code>package {[packages]:</code>
<code> </code><code>class apache {</code>
<code> </code><code>$packages += [</code><code>'httpd'</code><code>]</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>}</code>
<code>}</code>
<code>include nginx</code>
#檢視源檔案的内容:
<code>[root@sh-web1 ~]</code><code># cat 3.pp </code>
<code> </code><code>package {[packages]:</code>
<code> </code><code>ensure=> present,</code>
<code> </code><code>package {[packages]:</code>
<code> </code><code>ensure => present,</code>
檔案模式:
通過file資源設定檔案權限時要注意:
1、檔案權限應該由4位數字組成,而非3位.(之前文章都是三位,官網推薦四位)
2、權限數字應該要使用''引起來.(之前文章這塊有些沒有引)
<code> </code><code>file</code> <code>{</code><code>"/tmp/test.txt"</code><code>: </code>
<code> </code><code>ensure =></code><code>file</code><code>,</code>
<code> </code><code>mode =></code><code>'0644'</code><code>,</code>
<code> </code><code>mode =>644,</code>
if條件語句的規範
通常不建議将selector語句與資源混用.
推薦寫法:
<code>$file_mode= $::operatingssytem ? {</code>
<code> </code><code>debian=> </code><code>'0700'</code><code>,</code>
<code> </code><code>redhat=> </code><code>'0644'</code><code>,</code>
<code> </code><code>Centos=> </code><code>'0644'</code><code>,</code>
<code> </code><code>file</code> <code>{</code><code>'/tmp/test.txt'</code><code>:</code>
<code> </code><code>conten => </code><code>"hello world\n"</code><code>,</code>
<code> </code><code>mode => $file_mode,</code>
不推薦寫法:
<code>file</code> <code>{</code><code>'/tmp/test.txt'</code><code>:</code>
<code> </code><code>mode => $::operatingssytem ? {</code>
<code> </code><code>conten => </code><code>"hello world\n"</code><code>,</code>
<code> </code><code>mode => $file_mode,</code>
class的規範:
符号關聯關系:
通過->符号建立資源之間的關聯關系的順序為從"左到右".
Package["httpd"] -> Service["httpd"]
Service["httpd"] -> Package["httpd"]
子產品的繼承:
繼承可以在子產品中使用,但不推薦跨子產品的命名空間使用.
class ssh{}
class ssh::client inherits {}
class ss::service inherits {}
跨子產品繼承(不推薦):
class ssh::client work {}
class ss::service apache {}
标示符命名規範:
1)變量命名規則
符合正規表達式規範(\A\$[a-zA-Z0-9_]+\Z),不包含特殊的字元.如%@^等.
變量名區分大小寫,如$foo和$FOO為不同的變量。
class類的命名規範:
如果類名中使用了命名空間需要以"::"作為分隔,并符合正規表達式規範(\A([a-z][a-z0-9_]*)?(::[a-z][a-zA-Z0-9]*)*\Z)
modules命名規則:
符合正規表達式規範。
子產品名的首字母不能為大寫.
tag命名規則:符合正規表達式規範(/\A[a-z0-9._-]+\Z)。
nodes節點命名規則:符合正規表達式規範(/\A[a-z0-9._-]+\Z)。
puppet檔案的導入和類的聲明
在manifests目錄内檔案與檔案之間的導入功能通常使用import函數來完成。
示例1:
site.pp
import nodes
示例2:
import 'nodes/*.pp'
注釋:import函數可以導入manifests目錄中的一個檔案,也可以導入多個檔案,多個檔案可以使用通配符"*"來表示.
類的聲明:
<code> </code><code>node base { </code>
<code> </code><code>include ntp</code>
<code> </code><code>include apache</code>
本文轉自青衫解衣 51CTO部落格,原文連結:http://blog.51cto.com/215687833/1970888