天天看點

Puppet代碼書寫規範(十九)

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=&gt; 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  =&gt; $mode</code>

不推薦:

<code>    </code><code>mode  =&gt; </code><code>"$mode"</code>

<code>    </code><code>mode  =&gt; </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=&gt; root,</code>

資源屬性順序:

<code>        </code><code>ensure=&gt; 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    =&gt; present,</code>

<code>        </code><code>}</code>

<code>        </code><code>service {</code><code>"nginx"</code><code>:</code>

<code>            </code><code>ensure    =&gt; </code><code>true</code><code>,</code>

<code>            </code><code>enable</code>    <code>=&gt; </code><code>true</code><code>,</code>

<code>            </code><code>require    =&gt; 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    =&gt; 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 =&gt; link,并通過target屬性來指定目标檔案.

<code>    </code><code>file</code> <code>{</code><code>"/tmp/3.pp"</code><code>:</code><code>#軟連接配接檔案.(目标檔案)    </code>

<code>        </code><code>ensure=&gt; link,</code>

<code>        </code><code>target=&gt; </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=&gt; </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  =&gt; 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=&gt; present,</code>

<code>        </code><code>package {[packages]:</code>

<code>           </code><code>ensure  =&gt; 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 =&gt;</code><code>file</code><code>,</code>

<code>        </code><code>mode   =&gt;</code><code>'0644'</code><code>,</code>

<code>        </code><code>mode   =&gt;644,</code>

if條件語句的規範

通常不建議将selector語句與資源混用.

推薦寫法:

<code>$file_mode= $::operatingssytem ? {</code>

<code>    </code><code>debian=&gt; </code><code>'0700'</code><code>,</code>

<code>    </code><code>redhat=&gt; </code><code>'0644'</code><code>,</code>

<code>    </code><code>Centos=&gt; </code><code>'0644'</code><code>,</code>

<code>    </code><code>file</code> <code>{</code><code>'/tmp/test.txt'</code><code>:</code>

<code>        </code><code>conten =&gt; </code><code>"hello world\n"</code><code>,</code>

<code>        </code><code>mode =&gt; $file_mode,</code>

不推薦寫法:

<code>file</code> <code>{</code><code>'/tmp/test.txt'</code><code>:</code>

<code>    </code><code>mode =&gt; $::operatingssytem ? {</code>

<code>    </code><code>conten =&gt; </code><code>"hello world\n"</code><code>,</code>

<code>    </code><code>mode =&gt; $file_mode,</code>

class的規範:

符号關聯關系:

通過-&gt;符号建立資源之間的關聯關系的順序為從"左到右".

Package["httpd"] -&gt; Service["httpd"]

Service["httpd"] -&gt; 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