上一篇主要介紹了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, } }