1、模板的應用node
到目前爲止,資源申報、定義類、聲明類等全部功能都只能一個manifest文件中實現,但這卻非有效的基於puppet管理IT資源架構的方式。實踐 中,通常須要把manifest文件分解成易於理解的結構,例如將類文件、配置文件甚至包括後面講提到的模板文件等分類存放,而且經過某種機制在必要時將 他們整合起來。這種機制即成爲「模板」,它有助於結構化、層次化的方式使用puppet,而puppet則基於「模塊自動裝載器」完成模塊裝載mysql
從另外一個角度來講,模板實際上就是一個按約定的、預約義的機構存放了多個文件或子目錄的目錄,目錄裏的這些文件或子目錄必須遵循其命名規範。 puppet會按照這種規範在特定位置查找所需的模塊文件,不過,這些特定目錄頁能夠經過puppet的配置參數modulepath定義linux
只要在某模塊中定於了一個類,就能夠在任何manifest文件中使用它,puppet會自動去查找並裝載包含了這個類的定義的manifest文件任 意使用它們。因而,基於模塊機制的puppet的主manifest文件就能夠變得很小,也更易懂並能基於策略進行定製 註釋:控制節點;master 與 slave 時間須要同步;nginx
模塊目錄的結構web
在puppet中,模塊自己用一個目錄來表示,其須要存放於puppet的modulepath參數所定義的目錄中,如/etc/puppet/modules。模塊目錄名稱必須與模塊名稱相同,須要遵循特定的組織結構sql
MODULE NAME數據庫
manifestsruby
init.ppbash
files服務器
templates
lib
tests
spec
MODULE NAME:模塊名稱,也即模塊目錄名稱:模塊只能以小寫字母開頭,能夠包含小寫字母、數字和下劃線,但不能使用「main」和「settings」做爲模塊名
manifests目錄:包含當前模塊的全部manifest文件:每一個manifest文件包含了一個類或一個定義的類型,此文件訪問路徑格式爲「Modulename::[SubDirectoryName::]ManifestFileName」。
init.pp:只能包含一個單獨的類定義,且類的名稱必須與模塊名稱相同
files目錄:包含了一組靜態的文件,這些文件可被站點下載使用:每一個文件的訪問路徑都遵循puppet:///modules/MODELE_NAME/filename路徑格式
lib目錄:插件目錄,經常使用於自定義fact及自定義資源類型等
templates目錄:存儲了manifest用到的模板文件,其訪問路徑遵循template(‘ModulesName/TemplateName’)格式,後綴名應該爲.erb,關於模板文件詳細信息,後文有介紹
tests目錄:當前模板的使用幫助或使用範例文件,相似如何聲明當前模板中的類及定義的類型等
spec目錄:相似於tests目錄的功能,只不過,其是爲lib目錄定義的各插件提供使用範例的
[root@node1 ~]# mkdir -p /etc/puppet/modules/nginx/{manifests,files,templates,lib} [root@node1 ~]# cd /etc/puppet/modules/nginx/ [root@node1 nginx]# cd manifests/ [root@node1 manifests]# vi init.pp class nginx { package {'nginx': ensure => installed, name => nginx, } } [root@node1 manifests]# vi web.pp class nginx::web inherits nginx { service {'nginx': ensure => true, enable => true, name => nginx, require => Package['nginx'], } file{'web.conf': ensure =>file, source => "puppet:///modules/nginx/web.conf", path => '/etc/nginx/nginx.conf', notify => Service['nginx'], require => Package['nginx'] } } [root@node1 manifests]# puppet apply -e 'include nginx::web' notice: /Stage[main]/Nginx/Package[nginx]/ensure: created notice: /Stage[main]/Nginx::Web/File[web.conf]/content: content changed '{md5}d9dfc198c249bb4ac341198a752b9458' to '{md5}33d2119b71f717ef4b981e9364530a39' notice: /Stage[main]/Nginx::Web/Service[nginx]/ensure: ensure changed 'stopped' to 'running' notice: Finished catalog run in 8.07 seconds [root@node1 manifests]# grep work /etc/nginx/nginx.conf worker_processes 2;
準備nginx配置文件,並有意修改nginx的配置文件
[root@node1 ~]# cp /etc/nginx/nginx.conf /etc/puppet/modules/nginx/files/web.conf [root@node1 ~]# grep worker_processes /etc/puppet/modules/nginx/files/web.conf worker_processes 2;
能夠看到咱們的配置執行成功
使用模板配置文件
語法:<%= Ruby Expression %>:替代爲表達式的值,在使用表達式時應該使用@引用
<% ruby code %>:僅執行代碼,不作任何替換,經常使用於條件判斷或循環語句、設定變量以及在輸出以前對數據進行處理
<%# commit %>:註釋信息
<%%: 輸出<%
%%>:輸出%>
如上面的案例,在使用模板後
[root@node1 manifests]# cp /etc/puppet/modules/nginx/files/web.conf /etc/puppet/modules/nginx/templates/conf.erb [root@node1 manifests]# grep work /etc/puppet/modules/nginx/templates/conf.erb worker_processes <%= @processorcount %>; 表示nginx的線程數按照cpu的個數來啓動 類應該改成以下所示 class nginx::web inherits nginx { service {'nginx': ensure => true, enable => true, name => nginx, require => Package['nginx'], } file{'web.conf': ensure =>file, content =>template('nginx/conf.erb'), path => '/etc/nginx/nginx.conf', notify => Service['nginx'], require => Package['nginx'] } } [root@node1 manifests]# puppet apply -e 'include nginx::web' notice: /Stage[main]/Nginx/Package[nginx]/ensure: created notice: /Stage[main]/Nginx::Web/Service[nginx]/ensure: ensure changed 'stopped' to 'running' notice: Finished catalog run in 8.25 seconds [root@node1 manifests]# grep work /etc/nginx/nginx.conf worker_processes 1;
2、master/agent
應用場景:
統一資源管理軟件
統一配置系統優化參數
按期檢測服務器是否運行
主機上的軟件配置合理的屬性
1.安裝
前提:配置實用epel的yum源,然後使用yum命令安裝便可
環境規劃
192.168.1.201 puppet-server端
192.168.1.202 puppet-agent端
安裝部署puppet服務器端
[root@node1 manifests]# yum install puppet-server
安裝部署puppet客戶端
[root@node2 ~]# yum install puppet -y
2.解析雙方主機
解析雙方主機,可使用DNS和hosts文件,因爲本處實驗的緣故,故使用的爲/etc/hosts文件來解析雙方主機
建議的主機命名方式:
角色名-運營商-機房名-機器ip.域名
[root@node1 manifests]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.0.1 server.magelinux.com server 192.168.1.201 node1.firefox.com node1 192.168.1.202 node2.firefox.com node2 192.168.1.203 node3.firefox.com node3 192.168.1.204 node4.firefox.com node4
3.啓動
1)啓動puppet服務器端
收起啓動puppet守護進程時,其會自動進行運行環境的初始化,例如建立一個本地CA及服務器端相關的證書和密鑰等。初始化操做完成後,puppet 就會監聽指定的套接字並等待客戶端的鏈接請求。默認狀況下,其證書和密鑰等文件位於/var/lib/puppet/ssl目錄中
出於調試的目的,建議首次啓動puppet服務進程能夠以非守護進程方式進行,並讓其輸出詳細信息以便於觀察初始化過程,以下所示,其逐步展現了建立本 地主叫向CA申請證書、得到證書以及CA移除證書籤署請求的過程等,然後啓動服務進程並準備接受各agent端的鏈接請求
使用puppet master --genconfig能夠查看服務器端的配置信息,建議將其輸出到/etc/puppet/puppet.conf中
[root@node1 ~]# puppet master --genconfig >> /etc/puppet/puppet.conf
注意:若是此前曾以其主機名或各類緣由啓動過puppet客戶端過程並完成過初始化,其證書文件將沒法符合本次啓動的須要:此時,須要先狀況/var/lib/puppet/ssl目錄方可完成後續的初始化操做
如上述的測試啓動沒有問題,可終止當前的啓動後將其以守護進程方式啓動
# 安裝puppet-server程序包 yum localinstall facter-1.7.3-1.el6.x86_64.rpm puppet-2.7.25-1.el6.noarch.rpm puppet-server-2.7.25-1.el6.noarch.rpm # 生成master配置文件: puppet master --genconfig >> /etc/puppet/puppet.conf # 啓動puppetmaster服務 puppetmasterd -v -d --no-daemonize # 前臺測試啓動 service puppetmaster start # 正式啓動服務 # 服務驗證:ss -antupl |grep 8140
2)啓動puppet客戶端
puppet agent在首次啓動時,會想起指定的puppet server申請證書,並完成後續鏈接請求,一樣的理由,處於測試的目的,接入當前puppet集羣中的首個agent節點能夠以非守護進程的方式運行,以觀察其初始化過程
[root@node2 ~]# puppet agent --server=node1.firefox.com --no-daemonize --debug info: Creating a new SSL key for node2.firefox.com info: Caching certificate for ca info: Creating a new SSL certificate request for node2.firefox.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選項
[root@node1 ~]# puppet cert --list "node2.firefox.com" (BC:B2:36:9F:B5:78:CD:60:1E:72:9A:D5:88:DE:4B:57) [root@node1 ~]# puppet cert --sign node2.firefox.com notice: Signed certificate request for node2.firefox.com notice: Removing file Puppet::SSL::CertificateRequest node2.firefox.com at '/var/lib/puppet/ssl/ca/requests/node2.firefox.com.pem
一旦agent節點收到簽署過的證書,其將會顯示以下信息
info: Caching certificate for node2.firefox.com notice: Starting Puppet client version 2.7.25
確保上述agent相關操做不存在問題後,即可以將--server選項指定的信息存儲與agent的配置文件中,並以服務的方式啓動puppet agent了。其配置文件爲/etc/puppet/puppet.conf,配置完整既能夠期待可以puppet
[root@node2 ~]# echo "server=node1.firefox.com" >> /etc/puppet/puppet.conf [root@node2 ~]# service puppet start Starting puppet: [ OK ] [root@node2 ~]# chkconfig puppet on
agent配置
# 安裝puppet程序包 yum localinstall facter-1.7.3-1.el6.x86_64.rpm puppet-2.7.25-1.el6.noarch.rpm # 編輯配置文件 vi /ect/puppet/puppet.conf # 在[agent]段添加server=Puppetmaster_Hostname,如 server = master.lamp.com # 啓動puppet服務 puppet agent --server mem.lamp.com -v -d --noop --test # 測試啓動,不實際應用配置 service puppet start # 正式啓動agent服務 chkconfig puppet on # 配置開啓啓動
master簽署證書
# 手動簽發: puppet cert list # 顯示待簽發節點的證書請求 puppet cert sign Node_Name # 簽署某一agent的請求 puppet cert sign --all # 一次性簽署所有請求 # 自動簽發: cat > /etc/puppet/autosign.conf <<EOF *.firefox.com EOF # 會對全部來自firefox.com的主機請求都自動簽發 # 注:master端的任何修改,都要從新裝載puppetmaster服務,即執行以下命令便可 service puppetmaster reload
4.受權訪問
在puppet服務器端的/etc/puppet/manifests/中建立site.pp,在master/agent時,全部節點清單文件入口文件爲site.pp
[root@node1 manifests]# pwd
/etc/puppet/manifests
[root@node1 manifests]# ls
node2.mysql.com.pp site.pp
[root@node1 manifests]# cat node2.firefox.com.pp
node 'node2.firefox.com' {
include nginx::web
}
[root@node1 manifests]# cat site.pp
import "*.forefox.com.pp"
建議:一類節點使用一個清單文件,全部清單文件都在site.pp中使用improt包含進來,清單文件修改後應重啓文件
5.自動簽發證書
能夠設置master自動簽發全部的證書,咱們只須要在/etc/puppet目錄下建立autosign.conf文件便可
[root@node1 ~]# echo "*.firefox.com" > /etc/puppet/autosign.con
這樣就會對全部來自magedu.conf的機器的請求自動簽署證書
6.puppet kick功能實現
puppet客戶端默認每30分鐘很服務器通信一次,可是有時,咱們但願服務器可以給客戶端緊急推送一些人物,因而就有了puppet kick(puppet 2.6之前叫puppetrun)
1)編輯客戶端配置文件/etc/puppet/puppet.conf在[agent]端中添加以下
[root@node2 ~]# echo "listen=true" >> /etc/puppet/puppet.conf [root@node2 puppet]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 5 *:8139 *:*
2)在客戶端編輯或建立新文件/etc/puppet/namespaceauth.conf,包含下面內容
[puppetrunner]
allow *.firefox.com
3)在客戶端編輯文件auth.conf,添加以下內容
path /run
method save
auth any
allow *.firefox.com
4)推送方法,在服務器端運行命令
[root@node1 puppet]# puppet kick -p 10 node2.firefox.com Triggering node2.firefox.com Getting status status is success node2.firefox.com finished with exit code 0 Finished
查看node2
[root@node2 puppet]# rpm -q nginx nginx-1.0.15-5.el6.x86_64 [root@node2 puppet]# grep work /etc/nginx/nginx.conf worker_processes 1;
錯誤信息,慘痛的教訓,客戶端一致在報這個錯誤
err: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate is not yet valid for /CN=Puppet CA: node1.firefox.com] warning: Not using cache on failed catalog err: Could not retrieve catalog; skipping run debug: report supports formats: b64_zlib_yaml pson raw yaml; using pson err: Could not send report: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed: [certificate is not yet valid for /CN=Puppet CA: node1.firefox.com]
解決方法:
兩臺服務器須要時間同步
7.安裝配置puppet-dashboard
1)安裝
[root@node1 puppet]# rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm //安裝官方經過的yum倉庫 [root@node1 puppet]# yum install puppet-dashboard -y [root@node1 puppet]# yum install mysql-server mysql -y
2)數據庫受權
mysql> create database dashboard character set utf8; Query OK, 1 row affected (0.00 sec) mysql> grant all on dashboard.* to 'dbuser'@'192.168.1.%' identified by 'firefox'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
3)修改配置文件,dashboard的配置文件爲/usr/share/puppet-dashboard/config/database.yml,修改以下參數
production: host:192.168.1.201 database: dashboard username: dbuser password:firefox encoding: utf8 adapter: mysql
爲dashboard導入依賴的數據表
[root@node1 config]# gem install rake [root@node1 puppet]# cd /usr/share/puppet-dashboard/config [root@node1 config]# rake gems::refresh_specs [root@node1 config]# rake RAILS_ENV=production db:migrate
啓動服務
[root@node1 config]# service puppet-dashboard start Starting Puppet Dashboard: => Booting WEBrick => Rails 2.3.17 application starting on http://0.0.0.0:3000 [ OK ]
4)配置puppet服務器和客戶端
服務器端配置
在puppetmaster的配置文件中添加以下內容
reports = store, http reporturl = http://192.168.1.201:3000/reports/upload 在[master]中添加
客戶端配置
report=true 在[agent]中添加
配置完成後重啓puppet
5)測試
還能夠在頁面中添加節點和類文件
終於完成了,一個時間不一樣步弄了2小時才找出錯誤。