天天看點

Puppet條件語句,class,module的使用

一、Puppet條件語句和類

   Puppet2.7系列的版本支援使用3種條件判斷語句,包括:if,case,selector,puppet也支援使用class是用于通用目标的一組資源,是以,它是命名的代碼塊,在某位置建立之後可在puppet全局使用,類似于其他程式設計語言中類的功能,puppet的class可以被繼承,也可以包含子類。

二、Puppet子產品

   到目前為止,資源申報、定義類、聲明類等所有功能都隻能再一個manifest檔案中實作,但這卻非最有效的基于puppet管理IT基礎架構的方式,實踐中,一般需要把manifest檔案分解成易于了解的結構,例如将類檔案,配置檔案、子產品檔案等分類存放,并且通過某種機制在必要時将它們整合起來,這種機制就是“子產品”,它有助于以結構化、階層化的方式使用puppet,而puppet則基于“子產品自動裝載器”完成子產品裝載,子產品實際就是一個按約定的、預定義的結構存放了多個檔案或子目錄的目錄,目錄裡的這些檔案或子目錄必須遵循其命名規範,puppet會按此種規範在特定位置查找所需要的子產品檔案,不過,這些特定的目錄也可以通過puppet的配置參數modulepath定義。

首先來示範下if語句的使用,if又包括單分支,雙分支,多分支語句

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<code>[root@node1 ~]</code><code># vi test6.pp</code>

<code>if</code> <code>$operatingsystem =~ /(?i-mx:^(centos|fedora|redhat))/ {</code>

<code>        </code><code>$webserver = </code><code>'httpd'</code>

<code>} elsif operatingsystem  =~ /(?i-mx:^(debian|ubuntu))/ {</code>

<code>        </code><code>$webserver = </code><code>'apache2'</code>

<code>} </code><code>else</code> <code>{</code>

<code>        </code><code>$webserver = undef</code>

<code>        </code><code>notice(</code><code>'Unkown OS'</code><code>)</code>

<code>}</code>

<code>package {</code><code>"$webserver"</code><code>:</code>

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

<code>[root@node1 ~]</code><code># puppet apply test6.pp</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Package</code><code>[httpd]</code><code>/ensure</code><code>: created</code>

<code>notice: Finished catalog run </code><code>in</code> <code>2.91 seconds</code>

<code>[root@node1 ~]</code><code># rpm -q httpd</code>

<code>httpd-2.2.15-30.el6.centos.x86_64</code>

<code># 使用多分支if判斷語句,operatingsystem頂級變量,根據目前系統安裝所要安裝的程式包</code>

case語句,類似if語句,case語句會從多個代碼塊中選擇一個分支執行,這跟其他程式設計語言中的case語句功能一緻,case語句會接受一個控制表達式和一組case代碼塊,并執行第一個比對到控制表達式的塊

<code>[root@node1 ~]</code><code># vi test7.pp</code>

<code>case</code> <code>$operatingsystem {</code>

<code>        </code><code>'Solaris'</code><code>:              {notice(</code><code>"Welcome to Solaris"</code><code>)}</code>

<code>        </code><code>'RedHat'</code><code>,</code><code>'CentOS'</code><code>:      {notice(</code><code>"Welcome to RedHat OSFamily"</code><code>)}</code>

<code>        </code><code>/^(Debian|Ubuntu)$/:    {notice(</code><code>"Welcome to $1 linux"</code><code>)}</code>

<code>        </code><code>default:                {notice(</code><code>"Welcome,alien *_*"</code><code>)}</code>

<code>[root@node1 ~]</code><code># puppet apply test7.pp</code>

<code>notice: Scope(Class[main]): Welcome to RedHat OSFamily</code>

<code>notice: Finished catalog run </code><code>in</code> <code>0.01 seconds</code>

selector語句,selector隻能用于期望出現直接值的地方,這包括變量指派,資源屬性,函數參數,資源标題,其他selector的值及表達式,selector不能用于一個已經嵌套于selector的case中,也不能用于一個已經嵌套于case的case語句中

<code>[root@node1 ~]</code><code># vi test8.pp</code>

<code>$webserver = $operatingsystem ? {</code>

<code>   </code><code>/(?i-mx:ubuntu|debian)/        =&gt; </code><code>'apache2'</code><code>,</code>

<code>   </code><code>/(?i-mx:centos|fedora|redhat)/ =&gt; </code><code>'httpd'</code><code>,</code>

<code>notify {</code><code>"$webserver"</code><code>:</code>

<code>        </code><code>message =&gt; </code><code>"install $webserver"</code><code>,</code>

<code>[root@node1 ~]</code><code># puppet apply test8.pp</code>

<code>notice: </code><code>install</code> <code>httpd</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Notify</code><code>[httpd]</code><code>/message</code><code>: defined </code><code>'message'</code> <code>as </code><code>'install httpd'</code>

<code>notice: Finished catalog run </code><code>in</code> <code>0.02 seconds</code>

class的使用

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

<code>[root@node1 ~]</code><code># vi test9.pp</code>

<code>class nginx {</code>

<code>        </code><code>package {</code><code>'nginx'</code><code>:</code>

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

<code>                </code><code>before =&gt; File[</code><code>'/etc/nginx/nginx.conf'</code><code>],</code>

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

<code>        </code><code>file</code> <code>{</code><code>'/etc/nginx/nginx.conf'</code><code>:</code>

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

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

<code>                </code><code>owner =&gt; </code><code>'root'</code><code>,</code>

<code>                </code><code>group =&gt; </code><code>'root'</code><code>,</code>

<code>                </code><code>source</code> <code>=&gt; </code><code>'/tmp/nginx.conf'</code><code>,</code>

<code>                </code><code>notify =&gt; Service[</code><code>'nginx'</code><code>],</code>

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

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

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

<code>include nginx</code>

<code># 使用include來調用class</code>

<code>[root@node1 ~]</code><code># puppet apply test9.pp</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/Package</code><code>[nginx]</code><code>/ensure</code><code>: created</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>

<code>notice: Finished catalog run </code><code>in</code> <code>2.16 seconds</code>

<code># 也可以使用以下方式調用,這種方式可以傳遞參數</code>

<code>class {</code><code>'nginx'</code><code>:}</code>

<code>notice: Finished catalog run </code><code>in</code> <code>2.06 seconds</code>

使用class方法調用類,還可以傳遞參數實作,根據參數來安裝不同的服務,比如想安裝tengine

52

53

54

55

<code>class webserver ($wbsvr=</code><code>'nginx'</code><code>) {</code>

<code>        </code><code>package {</code><code>"$wbsvr"</code><code>:</code>

<code>class {</code><code>'webserver'</code><code>:</code>

<code>        </code><code>wbsvr =&gt; </code><code>'nginx'</code><code>,</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Package</code><code>[nginx]</code><code>/ensure</code><code>: created</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>

<code>notice: Finished catalog run </code><code>in</code> <code>2.09 seconds</code>

<code>        </code><code>wbsvr =&gt; </code><code>'tenginx'</code><code>,</code>

<code>err: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Package</code><code>[tenginx]</code><code>/ensure</code><code>: change from absent to present failed: Execution of </code><code>'/usr/bin/yum -d 0 -e 0 -y install tenginx'</code> <code>returned 1: Error: Nothing to </code><code>do</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]: Dependency Package[tenginx] has failures: </code><code>true</code>

<code>warning: </code><code>/Stage</code><code>[main]</code><code>/Webserver/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]: Skipping because of failed dependencies</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Service</code><code>[nginx]: Dependency Package[tenginx] has failures: </code><code>true</code>

<code>warning: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Service</code><code>[nginx]: Skipping because of failed dependencies</code>

<code>notice: Finished catalog run </code><code>in</code> <code>0.41 second</code>

類也可以被繼承,實作根據不同情況調用不同的類

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

<code>[root@node1 ~]</code><code># vi test10.pp</code>

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

<code>class nginx::websvr inherits nginx {</code>

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

<code>                </code><code>require =&gt; Package[</code><code>'nginx'</code><code>],</code>

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

<code>class nginx::rproxy inherits nginx {</code>

<code>                </code><code>source</code> <code>=&gt; </code><code>'/tmp/nginx-proxy.conf'</code><code>,</code>

<code>include nginx::websvr</code>

<code>[root@node1 ~]</code><code># puppet apply test10.pp</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Websvr</code><code>/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Websvr</code><code>/Service</code><code>[nginx]</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>1.81 seconds</code>

<code># 調用nginx::rproxy類</code>

<code>include nginx::rproxy</code>

<code>notice: Finished catalog run </code><code>in</code> <code>0.15 seconds</code>

puppet子產品的建立和使用

<code># 安裝puppet-server</code>

<code>[root@node1 ~]</code><code># rpm -ivh puppet-server-2.7.23-1.el6.noarch.rpm</code>

<code># 建立子產品目錄結構</code>

<code>[root@node1 ~]</code><code># mkdir -pv /etc/puppet/modules/nginx/{manifests,files,lib,templates,tests,spec}</code>

<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/manifests</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/files</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/lib</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/templates</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/tests</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/spec</code><code>'</code>

<code>[root@node1 ~]</code><code># puppet module list</code>

<code>/etc/puppet/modules</code>

<code>└── nginx (???)</code>

<code>/usr/share/puppet/modules</code> <code>(no modules installed)</code>

MODULE NAME:子產品名稱,隻能以小寫字母開頭,也可以包含小寫字母、數字和下劃線,但不能使用“main”或者“settings”作為子產品名;

manifests目錄:包含目前子產品的所有manifest檔案;每個mainfest檔案必須包含一個類或一個定義的類,此檔案通路路徑格式為"ModuleName::[SubDircetoryName::]ManifestFileName",注意manifest檔案不需要其字尾.pp;

init.pp:隻能包含一個單獨的類定義,且類的名稱必須與子產品名稱相同;

files目錄:包含了一組靜态檔案,這些檔案可被節點下載下傳使用,每個檔案的通路路徑遵循

puppet:///modules/MODULE_NAME/filename路徑格式;

lib目錄:插件目錄,常用于自定義fact及自定義資源類型等;

templates目錄:存儲了manifest用到的模闆檔案,其通路路徑遵循template('ModulName/TemplateName')格式;

tests目錄:目前子產品的使用幫助或使用範例檔案,類似如何聲明目前子產品中的類定義的類型等;

spec目錄:類似于tests目錄的功能,隻不過,其是為lib目錄中定義的各插件提供使用的範例的;

在nginx子產品中定義init.pp

<code>[root@node1 ~]</code><code># vi /etc/puppet/modules/nginx/manifests/init.pp</code>

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

定義nginx_web.pp檔案

<code>[root@node1 ~]</code><code># vi /etc/puppet/modules/nginx/manifests/nginx_web.pp</code>

<code>class nginx::nginx_web inherits nginx {</code>

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

<code>            </code><code>source</code> <code>=&gt; </code><code>'puppet:///modules/nginx/nginx-web.conf'</code><code>,</code>

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

<code>            </code><code>owner =&gt; </code><code>'root'</code><code>,</code>

<code>            </code><code>group =&gt; </code><code>'root'</code><code>,</code>

<code>            </code><code>notify =&gt; Service[</code><code>'nginx'</code><code>],</code>

<code>            </code><code>require =&gt; Package[</code><code>'nginx'</code><code>],</code>

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

<code># 準備source檔案</code>

<code>[root@node1 ~]</code><code># cp /tmp/nginx.conf /etc/puppet/modules/nginx/files/nginx-web.conf</code>

定義nginx_proxy.pp檔案

<code>[root@node1 ~]</code><code># vi /etc/puppet/modules/nginx/manifests/nginx_proxy.pp</code>

<code>class nginx::nginx_proxy inherits nginx {</code>

<code>            </code><code>source</code> <code>=&gt; </code><code>'puppet:///modules/nginx/nginx-proxy.conf'</code><code>,</code>

<code>[root@node1 ~]</code><code># cp /tmp/nginx.conf /etc/puppet/modules/nginx/files/nginx-proxy.conf</code>

建立site.pp檔案調用前面定義的class

<code>[root@node1 ~]</code><code># vi /etc/puppet/manifests/site.pp</code>

<code>node </code><code>'node1.luojianlong'</code> <code>{</code>

<code>        </code><code>include nginx::nginx_web</code>

執行操作

<code>[root@node1 ~]</code><code># puppet apply /etc/puppet/manifests/site.pp</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_web</code><code>/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_web</code><code>/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_web</code><code>/Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>

<code>notice: Finished catalog run </code><code>in</code> <code>2.05 seconds</code>

這樣就是使用nginx-web.conf配置檔案啟動的nginx

也可以使用nginx-proxy.conf,啟動

<code>        </code><code>include nginx::nginx_proxy</code>

<code>[root@node1 ~]</code><code># yum -y remove nginx</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_proxy</code><code>/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_proxy</code><code>/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>

<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_proxy</code><code>/Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>

<code>notice: Finished catalog run </code><code>in</code> <code>2.11 seconds</code>

<code># 執行成功</code>

到此,Puppet條件語句,class,module的使用就介紹這麼多了。

     本文轉自ljl_19880709 51CTO部落格,原文連結:http://blog.51cto.com/luojianlong/1394883,如需轉載請自行聯系原作者

繼續閱讀