puppet 深刻講解

1、Modules概述
node


   到目前爲止,關於puppet的資源申報、定義類、聲明類等全部功能都只能在一個manifest(清單)文件中實現,但這卻非最有效的基於puppet管理IT基礎架構的方式linux

   實踐中,通常須要把manifest文件分解成易於理解的結構,例如將類文件、配置文件甚至包括後面將要提到的模板文件等分類存放,而且經過某種機制在必要時將他們整合起來;nginx

   這種機制就是「模板」,它有助於以結構化、層次化的方式使用puppet,而puppet則基於「板塊自動裝載器」完成模塊裝載,從另外一個角度來講,模板實際上就是一個按約定的、預約義的結構存放了多個文件或子目錄的目錄,目錄裏的這些文件或子目錄必須遵循其命名規法git

   puppet會按照此種規法在特定位置查找所需的模塊文件,不過,這些特定目錄也能夠經過puppet的配置參數modulepath定義web


    只要在某模板中定義了一個類,就能夠在任何manifest文件中使用它,puppet會自動去查找並裝載包含了這個類的定義的manifest文件任意使用他們。因而基於模塊機制的puppet的主manifest文件就能夠變得很小,也更易懂並能基於策略進行定製vim


    模塊目錄的結構windows

    在puppet中,模塊自己用一個目錄表示,其須要存放於puppet的modulepath參數所定義的目錄中,如/etc/puppet/modules,模塊目錄名稱必須與模塊名稱相同,須要遵循特定的組織結構,以下ruby


   

MODULE NAME
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    manifests
        init.pp
    files
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    templates
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
    lib
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    tests
    spec


 

MODULE NAME:模塊名稱,也是模塊目錄名稱;模塊名稱只能以小寫字母開頭,能夠包含小寫字母、數字和下劃線,但不能使用"main"或"setting"做爲模塊名;
   manifests目錄:包含當前模塊的全部manifest文件;每一個manifest文件必須
                  包含一個類或定義一個類,此訪問訪問路徑格式爲
                  "ModuleName::[SubDirectoryName::]ManifestFileName"
                   注意manifest文件名不須要其後綴.pp
              init.pp:只能包含了一個單獨的類定義,且類的名稱必須與模塊名稱相同;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
   files目錄 :包含了一組靜態文件,這些文件可被節點下載使用;每一個
               文件的訪問路徑遵循
       puppet://modules/MODULE_NAME/filename路徑格式
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
   lib  目錄 :插件目錄,經常使用於自定義fact及自定義資源類型等;
   templates目錄:存儲了manifest用到的模板文件,其訪問路徑遵循
       template('ModuleName/TemplateName')格式
   tests目錄 : 當前模塊的使用幫助或使用範例文件,相似於如何聲明當前模塊中的類即定義的類型等;
    spec目錄 :相似於tests目錄的功能,只不過,其是爲lib目錄定義的各插件提供使用範例的;


2、類知識點回顧bash


   

     類就是命名的代碼塊,存放着一個或者多個資源 ;能夠繼承服務器

     類的命名方式

     class class_name {

       ...puppet code...

     }

     子類的命名方式

       class parent_name::subclass_name inherits parent_name {

       }

     多級繼承的子類

       class grand_name::parent_name::subclass_name inherits grand_name::parent_name {

       }

       => 在子類中覆蓋父類中的資源

       +> 在子類中爲父類的資源新增屬性

       

     聲明類(3種方式)


        include

        require

        class { 'class_name':

               params1 =>value1,

               params2 =>value2,

        }


3、 實例演示


    nginx模塊:

        nginx  ---------------父類

            nginx程序包 ------父類定義的資源

        nginx::web  ---------子類1

            file    -------子類1定義的資源1

            service ------ 子類2定義的資源2

        nginx::rproxy -------子類2

            file    --------子類2定義的資源1

            service --------子類2定義的資源2          


    實現步驟:

   一、 定義一個父類清單,並應用測試

#puppet agent --configprint modulepath   查看模塊目錄路徑
 /etc/puppet/modules:/usr/share/puppet/modules 這兩個路徑均可以使用,均可以被puppet自動找到
# cd /etc/puppet/modules
# mkdir -pv nginx/{manifests,files,templates}
定義一個父類
# cd  /nginx/manifests
# vim init.pp
class nginx {
      package {'nginx':
            ensure => present,
            name   => nginx,
       }
}
# puppet apply -d -v -e 'include nginx'
# rpm -q nginx
  nginx-1.0.15-5.el6.x86_64

     咱們能夠不使用 #puppet apply -d -v -e 'include nginx'來應用

    另外一種方式應用 ----node調用

    知識點:

     

定義節點:也須要在清單文件中定義,文件名後綴爲.pp;在master/agent中,全部節點清單入口文件爲site.pp
格式:
  node 'node_name' {
      節點專用變量
      類聲明
  }
##建議一類節點使用一個清單文件,全部的清單文件都在site.pp中使用import包含進來

   

# vim  local.pp
node 'node3.linux.com' {
   include nginx
}
# puppet apply local.pp
# rpm -q nginx
  nginx-1.0.15-5.el6.x86_64


   二、定義兩個子類並應用測試

   

# cd  /etc/puppet/modules/nginx
# cp  /etc/nginx/nginx.conf files/nginx.web.conf
# cp  /etc/nginx/nginx.conf files/nginx.rproxy.conf
# vim files/nginx.web.conf 作以下修改
  worker_processes  4;
  worker_connections  10240;
# vim  files/nginx.reproxy.conf 作以下修改
  worker_processes  2;
###簡單修改下,方便後邊的應用測試

   

     2.1 建立子類nginx::web

# cd  /etc/puppet/modules/nginx
# cd manifests
# vim web.pp
class nginx::web inherits nginx {
  file {'nginx.conf':
        ensure  => file,
        source  => "puppet:///modules/nginx/nginx.web.conf",
        path    => '/etc/nginx/nginx.conf',
        require => Package['nginx'],
        mode    => '0644',
        notify  => Service['nginx'],
   }
   service {'nginx':
         ensure  => true,
         enable  => true,
         name    => nginx,
         restart => '/etc/inig.d/nginx reload',
   }

    應用子類nginx::web

   

先卸載掉nginx
# rpm  -e nginx
# puppet apply -d -v -e 'include nginx::web'
# rpm -q nginx
  nginx-1.0.15-5.el6.x86_64
# cat /etc/nginx/nginx.conf | grep worker_processes
  worker_processes  4;
# cat /etc/nginx/nginx.conf | grep worker_connections
  worker_connections  10240;
##跟咱們上邊修改的web.conf配置文件相同,應用正常

 

      2.2建立子類 nginx::rproxy

   

# cd /etc/puppet/modules/nginx/
# cd manifests
# vim rproxy.pp
class nginx::rproxy inherits nginx {
        file {'nginx.conf':
           ensure => file,
           source => "puppet:///modules/nginx/nginx.rproxy.conf",
           path   => "/etc/nginx/nginx.conf",
           require => Package['nginx'],
           mode   => '0644',
           notify => Service['nginx'],
         }
         service {'nginx':
            ensure => true,
            enable => true,
             restart => '/etc/init.d/nginx reload',
         }
}

     

    應用測試子類 nginx::rproxy

   

先將nginx卸載
# rpm -e nginx
# rm -rf /etc/nginx/
建立一個node調用
# vim local.pp
node 'node3.linux.com' {
   include nginx::rproxy
}
# puppet apply  local.pp
# rpm -q  nginx
 nginx-1.0.15-5.el6.x86_64
# service nginx status
nginx (pid  5669) 正在運行...
# cat /etc/nginx/nginx.conf | grep worker_processes
worker_processes  2;
###程序包已安裝,服務已啓動,並且rproxy.conf配置文件已經應用。


   

4、puppet模板


   語法:

      <%= Ruby Expression %>替換爲表達式的值

           <%= @processorcount %>

       <% ruby code %>僅執行代碼,不作任何替換;經常使用於條件判斷或循環語句、設定變量以及在輸出以前對數據進行處理;


       <%# commit%>註釋

       <%% 輸出<%

       %%>:顯示%>


       調用模板變量:變量徹底限定名稱

       迭代和條件判斷


       使用模板生成文件時,使用的文件屬性爲content

           content => template('module_name/template_file_name')


      實例:


     一、提供模板

#cd  /etc/puppet/modules/
#cd nginx/files
#rm -rf * 刪除過去拷貝的文件
#cp /etc/nginx/conf.d/default.conf nginx.web.conf
#cp /etc/nginx/conf.d/default.conf nginx.rproxy.conf
#vim nginx.web.conf 稍做修改
  server_name  node3.linux.com;
#vim nginx.rproxy.conf 稍做修改
   proxy_pass http://172.16.0.1;
#cd /etc/puppet/modules/nginx/templates
#cp /etc/nginx/nginx.conf . 提供一個模板文件
#vim nginx.conf 修改以下內容
 worker_processes  <%= @processorcount %>;
# mv nginx.conf nginx.conf.erb


    2 建立父類

     

# cd /etc/puppet/modules/nginx/manifests
# vim init.pp
class nginx {
      package {'nginx':
           ensure => present,
      }
      file {'nginx.conf':
           ensure => file,
           content => template('nginx/nginx.conf.erb'),
           path   => '/etc/nginx/nginx.conf',
           require => Package ['nginx'],
           mode   => '0644',
      }
}


    三、定義兩個子類 nginx::web  nginx::rproxy


    nginx::web

# cd /etc/puppet/modules/nginx/manifests
# vim web.pp
class nginx::web inherits nginx {
        file {'nginx.web.conf':
           ensure => file,
           source => "puppet:///modules/nginx/nginx.web.conf",
           path   => "/etc/nginx/conf.d/default.conf",
           require => Package['nginx'],
           mode   => '0644',
         }
         service {'nginx':
            ensure => true,
            enable => true,
             restart => '/etc/init.d/nginx reload',
            subscribe => File['nginx.conf','nginx.web.conf'],
         }
}


    nginx::rproxy

   

#cd /etc/puppet/modules/nginx/manifests
# vim rproxy.pp
class nginx::rproxy inherits nginx {
        file {'nginx.rproxy.conf':
           ensure => file,
           source => "puppet:///modules/nginx/nginx.rproxy.conf",
           path   => "/etc/nginx/conf.d/default.conf",
           mode   => '0644',
           notify => Service['nginx'],
         }
         service {'nginx':
            ensure => true,
            enable => true,
             restart => '/etc/init.d/nginx reload',
            subscribe =>File['nginx.conf','nginx.rproxy.conf'],
         }
}


    應用測試子類nginx::web

   

先卸載掉nginx
# rpm -e nginx
# rm -rf /etc/nginx/ 刪除目錄
# puppet apply -d -v -e 'include nginx::web'
# cat /etc/nginx/nginx.conf | grep worker_processes
  worker_processes  2;
根據 <%= @processorcount %>變量調用當前cpu的核心數
# cat /etc/nginx/conf.d/nginx.conf
  server_name  node3.linux.com;
####咱們修改的nginx.wen.conf 也應用上來了,一切正常

   

   


5、master/agent 架構


   即主從模式下工做

   agent每隔30分鐘向master發出請求,查看適用於本身的清單是否發生改變;

   wKioL1N4kCrAw-BSAAIG_O4CjXs986.jpg


    注意事項:

    1 master/agent 架構中,各個節點必須可以解析到彼此的主機名;

      標準的主機名命名方式爲:

        角色名-運營商-機房名-機器IP.域名

        例如:web-CNC-ShangHai-1.1.1.1.jungege.com

    2 各個節點要作到時間同步;


  1)安裝

     配置epel的yum源,使用yum命令安裝

     環境搭建:

       puppet-master 172.16.13.2 node2.linux.com

       puppet-agent  172.16.13.3 node3.linxu.com

 


     安裝puppet服務器端

     #yum  -y install puppet-server

     

     安裝puppet客戶端

     #yum -y install puppet

   2)解析雙方主機

     解析雙方主機,可使用DNS和hosts文件,咱們直接使用host解析的方式經I系那個

     建議的主機命名方式

        角色名-運營商-機房名-機器ip.域名

   

     

   3)master服務器配置

      初始化

     

#puppet master --daemonize -d -v
info: Creating a new SSL key for ca
info: Creating a new SSL certificate request for ca
info: Certificate Request fingerprint (md5): FA:B1:10:A7:AD:EA:8B:83:04:A1:3B:F8:4F:77:85:92
notice: Signed certificate request for ca
notice: Rebuilding inventory file
debug: Using cached certificate for ca
info: Creating a new certificate revocation list
info: Creating a new SSL key for node2.linux.com
debug: Using cached certificate for ca
info: Creating a new SSL certificate request for node2.linux.com
info: Certificate Request fingerprint (md5): 63:26:1D:A0:B9:D7:F4:0C:A7:E0:C4:59:8D:D9:04:19
notice: node2.linux.com has a waiting certificate request
debug: Using cached certificate for ca
debug: Using cached certificate_request for node2.linux.com
notice: Signed certificate request for node2.linux.com
notice: Removing file Puppet::SSL::CertificateRequest node2.linux.com at '/var/lib/puppet/ssl/ca/requests/node2.linux.com.pem'
notice: Removing file Puppet::SSL::CertificateRequest node2.linux.com at '/var/lib/puppet/ssl/certificate_requests/node2.linux.com.pem'
notice: Starting Puppet master version 2.7.23

 

         定義配置文件

         

#puppet  master genconfig >> /etc/puppet/puppet.conf         qi


    啓動服務

   

# service puppetmaster start
# ss -ntlp
默認偵聽在8140端口


    同步時間

    # ntpdate time.windows.com


   4)配置puppet客戶端


     puppet agent在首次啓動時,會像指定的puppet srver申請證書,並完成後續的鏈接請求,因爲咱們只是測試,接入當前puppet集羣中的首個agent節點能夠以非守護進程的方式運行,並觀察其啓動過程

     

# puppet  agent --server node2.linux.com --no-daemonize --debug
info: Creating a new SSL key for node2.linux.com
info: Caching certificate for ca
info: Creating a new SSL certificate request for node2.linux.com
info: Certificate Request fingerprint (md5): BC:B2:36:9F:B5:78:CD:60:1E:72:9A:D5:88:DE:4B:57


   此時,在puppet服務器段使用puppet cert命令管理客戶端的證書請求,--list選項可以查看等待簽署證書的客戶端列表,而--sign選項能夠用於爲指定節點簽署證書,若是要一次性地對多個節點申請進行簽署可使用--all選項

   

# puppet cert list
  "node3.linux.com" (A0:DA:47:AD:A5:AF:0F:89:54:31:50:A3:FB:BE:50:C0)
# puppet cert sign node3.linux.com
notice: Signed certificate request for node3.linux.com
notice: Removing file Puppet::SSL::CertificateRequest node3.linux.com at '/var/lib/puppet/ssl/ca/requests/node3.linux.com.pem

 

   一旦anget節點收到簽署過的證書,其將會顯示以下信息

   

# puppet agent --no-daemonize -d -v --test
info: Caching certificate for node3.linux.com
notice: Starting Puppet client version 2.7.25

   確保上述agent相關操做,不存在問題後,即可以使用--server選項指定puppet master服務器,並以守護進程的方式啓動服務了,其配置文件爲/etc/puppet/puppet.conf

 

# echo "server=node2.linux.com" >> /etc/puppet/puppet.conf
# service puppet start
# chkconfig puppet on

   5)site.pp的配置

   在puppet服務器段的/etc/puppet/manifests/中建立site.pp,在master/agent架構中,全部節點訪問清單文件的入口爲site.pp

   

# vim node3.linux.com.pp 若是有多個節點,就建立多個...
node 'node3.linux.com' {
   include nginx::web
}
# vim site.pp
import "*.linux.com.pp"

   建議:一類節點使用一個清單文件,全部清單文件都在site.pp文件中用import函數包含進來


  6)自動簽發證書

   能夠設置master自動簽發全部節點的證書,只須要在/etc/puppet目錄下建立autosign.conf便可

   

# echo "*.linux.com." > /etc/puppet/autosign.conf
這樣就會對全部來自autosign.conf的機器請求自動簽署證書

   

  7)puppet kick推送功能的實現


    puppet客戶端默認每30分鐘向服務器申請一次,有的特殊狀況須要馬上生效,則須要puppet kick將當前配置推送給客戶端,馬上實現目標狀態的改變

   ① 編輯客戶端配置文件/etc/puppet/puppet.conf 在[agent]段添加以下內容

# echo "listen=true" >> /etc/puppet/puppet.conf
# ss -ntl
默認偵聽在8139端口

   ② 在客戶端建立新文件/etc/puppet/namespaceauth.conf

     

[puppetrunner]
allow *.linux.com

     

   ③ 在客戶端編輯/etc/puppet/auth.conf文件,添加以下內容


   

path  /run
method save
auth  any
allow *.linux.com


   ④kick推送,在服務器段運行kick子命令

   

# puppet kick -p 10 node.linux.com
Triggering node3.linux.com
Getting status
status is success
node3.linux.com finished with exit code 0
Finished


   ⑤此時就能夠在客戶端節點查看變化了


    關於puppet-dashboard、foreman、git的使用與配置請參考其餘,此處再也不作詳解





PS:天熱了,電腦冒汗了,碼字真心慢!

相關文章
相關標籤/搜索