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發出請求,查看適用於本身的清單是否發生改變;
注意事項:
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:天熱了,電腦冒汗了,碼字真心慢!