一步一步學會puppet(二)--模塊和類

上一篇主要介紹了puppet的基本工作原理和資源的相關初步使用;

這一篇主要介紹puppet中很重要的2個概念:模塊和類;

===================================================================

1 模塊

   1.1 需求

   1.2 定義

   1.3 詳細說明

   1.4 模塊的目錄組織結構

   1.5 模塊管理

2 類

   2.1 定義

   2.2 詳細說明

   2.3 類的分類

   2.4 類的聲明

   2.5 實例

===================================================================


1 模塊

1.1 需求

若要定義一個完整的服務(如nginx服務),依賴單一的manifest文件(如nginx.pp)遠遠不夠,因爲一般的服務都需要依賴於衆多外部資源,如類繼承、靜態文件複製、模板等,故一個完整的服務就需要利用模塊來實現了;

1.2 定義

爲了實現某種完備功能而組織成一個獨立的、自我包含的目錄結構;

一句話就是:模塊就是一個目錄結構,目錄名就是模塊名;

1.3 詳細說明

  • 一般需要把manifest文件分解成易於理解的結構,例如將類文件、配置文件甚至包括後面將提到的模塊文件等分類存放,並且通過某種機制在必要時將它們整合起來,這種機制即“模塊”;

  • 只要在某模塊中定義了一個類,就可以在任何manifest文件中使用它,puppet會自動去查找並裝載包含了這個類的定義的manifest文件;

  • 因此,可以在puppet上提供多個模塊,並按需要在manifest文件任意使用它們。於是,基於模塊機制的puppet的主manifest文件就可以變得很小,也更易讀並能基於策略進行定製;

1.4 模塊的目錄組織結構

模塊的存放位置:

# puppetmasterd --configprint modulepath
/etc/puppet/modules:/usr/share/puppet/modules

如構建一個nginx模塊,模塊目錄是/etc/puppet/modules/nginx

manifests/:清單存儲目錄

  • init.pp:包含一個與模塊名稱同名的類,同時聲明其它子類

  • *.pp:一個清單通常只包含一個類,且建立的清單文件名與類名相同,如子類nginx::web對應web.pp清單文件

files/:文件存儲目錄

  • 訪問路徑:puppet:///modules/Module_Name/File_Name

templates/:模板存儲目錄

  • *.erb:使用模板函數template()裝載並運行其中模塊語言,運行後會生成靜態文件;

  • 訪問路徑:template(‘Module_Name/Template_Name’)

lib/:ruby插件存儲目錄,用於實現一些自定義的功能

tests/:當前模塊的使用說明和樣例;

spec/:爲lib目錄中的插件提供使用說明和樣例;

在模塊根目錄下,通常還需包含如下文檔

  • LICENSE # 版本說明

  • Modulefile # 模塊說明

  • README # 其它說明

1.5 模塊管理

在線下載模塊站點:https://forge.puppetlabs.com

顯示本地已安裝的模塊:puppet module list

搜索模塊:puppet module search Module_Name

安裝模塊:puppet module install Module_Name


2 類

2.1 定義

爲了實現通用目標或目的組織在一起的一個或多個資源,即命名的代碼塊;

2.2 詳細說明

  • 類在某位置創建之後可在puppet全局使用;

  • puppet的類可以繼承,也可以包含子類;

  • 類的名稱只能以小寫字母開頭,可以包含小字字母、數字和下劃線;

  • 每個類都會引入一個新的變量scope,這意味着在任何時候訪問類中的變量時,都得使用其完全限定名稱,如${nginx::params::nx_temp_dir};

2.3 類的分類

不帶參數的類:可通過include或資源式的方式進行聲明使用;

帶參數的類:同一個類在不同的OS上可能會略有不同,因此需要通過獲取相應系統的fact來實現有區別對待;然而,萬一相應的OS沒有輸出類所期望的fact或者是類依賴於非fact因素時,此機制將無法滿足需求;此時就需要使用帶參數的類來完成此類功能,同時在聲明類時爲其參數傳遞相應的值即可完成傳參功能;只能使用資源式的聲明方式;

2.4 類的聲明

類定義後,只有被調用纔會執行,調用類的操作就叫做“聲明一個類”

聲明類的方式主要有4種:

  • include Class_Name # 使用include聲明類

  • class {Class_Name: } # 使用資源式的聲明方式,可以聲明帶參數的類

  • require # 與include類似

  • ENC

2.5 實例

# puppet的帶參數的類使用
# vi class2.pp
$webserver = $operatingsystem ? { # 利用seletor表達式進行變量賦值,根據操作系統類型指定需安裝的程序包
    /^(?i-mx:centos|fedora|redhat)/ => 'httpd',
    /^(?i-mx:ubuntu|debian)/ => 'apache2',
}
class httpd ($pkgname='apache2') { # 帶參數的類的創建,()內可以逗號配置多個參數,並可使用=號配置參數的默認值
    package {"$pkgname":
        ensure => present,
    }
    service {"$pkgname":
        ensure => true,
        require => Package["$pkgname"],
    }
}
class {'httpd': # 資源式的類聲明
    pkgname => $webserver,
}
# 類的繼承的使用
# vi class3.pp
class nginx { # 定義父類
    package {'nginx':
    ensure => present,
    }
}
class nginx::web inherits nginx { 定義子類nginx::web,屬性繼承自nginx父類
   file {'/etc/nginx/nginx.conf':
        ensure => file,
        source => "/tmp/nginx/nginx.web.conf",
        notify => Service['nginx'],
    } ->
    service {'nginx':
        ensure => true,
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章