自動化運維工具 ~puppet~


一、模板的應用

   到目前為止,資源申報、定義類、聲明類等所有功能都只能一個manifest文件中實現,但這卻非有效的基於puppet管理IT資源架構的方式。實踐 中,一般需要把manifest文件分解成易於理解的結構,例如將類文件、配置文件甚至包括后面講提到的模板文件等分類存放,並且通過某種機制在必要時將 他們整合起來。這種機制即成為“模板”,它有助於結構化、層次化的方式使用puppet,而puppet則基於“模塊自動裝載器”完成模塊裝載

   從另一個角度來說,模板實際上就是一個按約定的、預定義的機構存放了多個文件或子目錄的目錄,目錄里的這些文件或子目錄必須遵循其命名規范。 puppet會按照這種規范在特定位置查找所需的模塊文件,不過,這些特定目錄頁可以通過puppet的配置參數modulepath定義

   只要在某模塊中定於了一個類,就可以在任何manifest文件中使用它,puppet會自動去查找並裝載包含了這個類的定義的manifest文件任 意使用它們。於是,基於模塊機制的puppet的主manifest文件就可以變得很小,也更易懂並能基於策略進行定制 注釋:控制節點;master 與 slave 時間需要同步;

   模塊目錄的結構

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

   MODULE NAME

       manifests

           init.pp

       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;
 
 

二、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)測試

   wKiom1N3ymDjIlBlAAKgVwMFy8Y726.jpg

   還可以在頁面中添加節點和類文件

   終於完成了,一個時間不同步弄了2小時才找出錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM