Puppet入門教程

    Puppet是一個爲實現數據中心自動化管理而設計的配置管理軟件。Puppet經過使用自有的puppet描述語言(與Ruby相似),可管理配置文件、用戶、cron任務、軟件包、系統服務等。在puppet中,這些實體統稱爲資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。 html

     Puppet採用C/S星狀的結構,全部的客戶端和一個或幾個服務器交互。每一個客戶端週期的(默認半個小時)向服務器發送請求,得到其最新的配置信息,保證和該配置信息同步。當puppet服務啓動時(如#service puppet start),每一個puppet客戶端每半小時(能夠設置,見本文「設置客戶端自動同步時間間隔」一節)鏈接一次服務器端,下載最新的配置文件,而且嚴格按照配置文件來配置服務器。配置完成之後puppet客戶端能夠反饋給服務器端一個結果消息。 node

    Puppet的服務器端保存着全部的對客戶端服務器的配置代碼,在puppet裏面叫作manifest. 客戶端下載manifest以後,能夠根據manifest對服務器進行配置,例如軟件包管理、用戶管理和文件管理等等。此外,puppet也能夠單機方式工做,這時,至關於對一臺機器的配置進行即時快照,便於後來還原各類配置(軟件包、文件等),相似於系統還原、GHOST,只是更靈活些。
    相對於CFEngine、LCFG、Bcfg2,Puppet的優點是,免費而且開源、語法及功能豐富、用戶羣廣大。
    Puppet採用Ruby語言編寫,源碼庫: https://github.com/puppetlabs/puppet
    Puppet主頁:http://puppetlabs.com/ linux

安裝篇

OS:CentOS Linux 6.0 64-bit git

主機信息: github

角色 主機名稱 IP
服務端 server.puppet 192.168.1.42
客戶端 client.puppet 192.168.1.43

準備工做:

1.Puppet使用ssl認證來確保客戶端與服務端的通訊,因此沒用經過認證,雙方沒法工做。要求主機上有SSL軟件包,這裏是openssl。 shell

2.聽說要在安裝puppet軟件前先設置主機名,由於生成證書的時候要把主機名寫入證書,若是證書生成好了再改主機名就連不上。 另外主機名必須使用FQDN格式。
           (1)server.puppet上以下設置
            編輯/etc/sysconfig/network,把那行HOSTNAME=server.puppet
    
            編輯/etc/hosts,把那行127.0.0.1 以後加上server server.puppet
            添加一行 192.168.1.43 client.puppet
服務器

           (2)client.puppet上以下設置
            編輯/etc/sysconfig/network,把那行HOSTNAME=client.puppet
    
            編輯/etc/hosts,把那行127.0.0.1 以後加上client client.puppet
            添加一行 192.168.1.42 server.puppet session

    設置完成後兩臺主機互PING檢查一下。 app

3.安裝puppet軟件 ide

# rpm -ivh /root/epel-release-6-5.noarch.rpm
warning: /root/epel-release-6-5.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:epel-release           ########################################### [100%]
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
# yum install -y puppet
程序安裝後主目錄爲/var/lib/puppet,而且默認生成配置目錄:
/etc/puppet/auth.conf
/etc/puppet/puppet.conf 
/etc/sysconfig/puppet


測試一下安裝狀況:

# service puppet status
 puppetd 已停
  代表puppet安裝成功。


4.在服務端和客戶端分別執行時間同步

    #ntpdate time.nist.gov

5.防火牆與SELinux

   服務端防火牆TCP的8140端口須開放
   服務端須要關閉SELinux
   

運行篇

方式一:單機模式

直接在命令行執行一個寫好的puppet文件,例如,新建一個文件在/puppet-demo/helloworld.pp(這種以pp後綴的文件在puppet中稱做manifest文件),內容以下:
node default{
        file { "/puppet-demo/msrdok.txt":
                content => "hello,world",
                mode => 0644; }
}

上面代碼的含義是在/puppet-demo/msrdok.txt位置建立文件,文件內容爲"hello,world",文件權限爲644。

運行

#puppet /puppet-demo/helloworld.pp
 notice: Finished catalog run in 0.01 seconds

而後查看/puppet-demo/msrdok.txt是否是被成功建立。
     採用這種方式,能夠把一些經常使用的配置操做保存成puppet腳本,當有新的環境須要配置時,直接在新機器上執行 puppet腳本便可。

方式二:C/S模式

  1. server.puppet主機上

    確保puppet服務端正在運行

    # service puppet start

    下面安裝puppet-server

    # yum install -y puppet-server 
    
    ......
    
    Installed:
      puppet-server.noarch 0:2.6.18-3.el6
    
    Complete!
     測試一下安裝後效果
    # service puppetmaster status
    puppetmasterd 已停
    # service puppetmaster start

    安裝完成後會在文件系統生成/etc/puppet/manifests目錄和/etc/puppet/fileserver.conf文件,注意puppet的第一個執行的代碼是在/etc/puppet/manifest/site.pp,當客戶端鏈接到服務端時默認會去執行這個site.pp文件。所以這個文件必須存在。
    如今,創建一個最簡單的site.pp文件,內容以下:

    node default{
        file {"/tmp/eye.txt": 
                    content => "1111,22";}
    }

    上面的代碼對默認連入的puppet客戶端執行一個操做,在/tmp目錄生成一個eye.txt文件,內容是"1111,22"

  2. client.puppet主機上

    執行

# puppetd --server server.puppet --test
    info: Caching certificate for ca
    info: Creating a new SSL certificate request for server.puppet 
    info: Certificate Request fingerprint (md5): 3B:16:1D:11:01:3B:DE:2D:CE:B5:07:65:29:25:29:33
    Exiting; no certificate found and waitforcert is disabled

       出現這個錯誤緣由是:客戶端未被服務端(主機server.puppet上)認證。 上面的命令讓puppetd 從 server.puppet 去讀取puppet配置文件. 第一次鏈接,雙方會進行ssl證書的驗證,這是一個新的客戶端,在服務器端那裏尚未被認證,所以須要在服務器端進行證書認證.在服務器端的機器上執行下面的命令來認證客戶端的證書 

/**執行這句會獲得待認證的客戶端,與puppet cert list等效,若是不存在待認證的客戶端,會出現 err: Could not call sign: Could not find certificate request for client.puppet**/ # puppetca -l  //等價於puppetca --list "client.puppet" (3B:16:1D:11:01:3B:DE:2D:CE:B5:07:65:29:25:29:33) # puppetca -s client.puppet //等價於puppetca --sign,對全部待認證客戶端簽名可以使用puppetca -s -a命令 

而後再從新在客戶端執行  

# puppetd --server server.puppet --test
info: Caching certificate for client.puppet
info: Caching certificate_revocation_list for ca
info: Caching catalog for client.puppet
info: Applying configuration version '1383189866'
notice: /Stage[main]//Node[default]/File[/tmp/eye.txt]/ensure: defined content as '{md5}bd869b69868f59b21be375383a51841c'
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.03 seconds
    
       也能夠在服務端執行如下命令對客戶端進行認證:

# puppet cert list
  "client.puppet" (3B:16:1D:11:01:3B:DE:2D:CE:B5:07:65:29:25:29:33)
  /**代表client.puppet主機未得到認證,下面的命令將進行認證。**/
  # puppet cert sign client.puppet
  notice: Signed certificate request for client.puppet
  notice: Removing file Puppet::SSL::CertificateRequest client.puppet at '/var/lib/puppet/ssl/ca/requests/client.puppet.pem'

        有時須要agent從新申請認證,以下操做:
        在服務端
        puppet cert clean client.puppet
        在客戶端:
        rm -f /var/lib/puppet/ssl/ca/requests/client.puppet.pem
        puppetd --test --trace --debug

        看配置是否有異常 

此次終於執行成功,是客戶端主機上查看/tmp目錄,看是否是已經有個eye.txt文件了。

設置客戶端自動同步時間間隔


默認狀況下,客戶端agent 每 30分鐘會向 master 請求一次。若是咱們不但願 agent 自動更新。
可採起如下任意方法:
(1)#puppet agent --server=192-9-117-162-app.com --test --no-client --listen
    #puppet agent --server=192-9-117-162-app.com --test --no-daemonize --onetime


(2)打開puppet服務所在文件,/etc/rc.d/init.d/puppet,找到
 [ -n "${PUPPET_SERVER}" ] && PUPPET_OPTS="--server=${PUPPET_SERVER} "
這一行,而後在最末尾添加--no-client 
添加後的效果:
[ -n "${PUPPET_SERVER}" ] && PUPPET_OPTS="--server=${PUPPET_SERVER} --no-client"
而後重啓客戶端puppet,/etc/init.d/puppet restart ,這樣客戶端就不會主動跟服務端同步了(記得把/etc/puppet/puppet.conf裏runinterval註釋掉)。
而後去服務端執行
#puppet kick -d --host 客戶端主機名
便可實現只想推送功能。


(3)在/etc/sysconfig/puppet文件中設置
PUPPET_EXTRA_OPTS=--no-client
這種方式與(2)中方法殊途同歸,但更簡潔、方便。


(4)在 /etc/puppet/puppet.conf 的 [main] 段加上以下的指令:

runinterval=3m  #間隔3分鐘


Troubleshootings


1.客戶端執行test出錯
# puppetd  --server server.puppet --test
err: Could not request certificate: Connection refused - connect(2)
Exiting; failed to retrieve certificate and waitforcert is disabled


解決辦法:
            (1)確保設置好hosts文件,
            (2)#service puppetmaster start)


2.服務器啓動puppetmaster失敗
# service puppetmaster start
啓動 puppetmaster:Could not prepare for execution: Cannot save ca; parent directory /var/lib/puppet/ssl/ca does not exist
                                                           [失敗]
解決辦法:關閉 SELinux


3.客戶端執行test出錯
# puppetd  --server server.puppet --test
warning: peer certificate won't be verified in this SSL session
info: Caching certificate for client.puppet
err: Could not retrieve catalog from remote server: certificate verify failed
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run


緣由:客戶端和服務器端的時間不一樣步。
解決辦法:客戶端和服務器端運行/usr/sbin/ntpdate time.nist.gov

參考文獻

http://docs.puppetlabs.com/references/stable/configuration.html

http://docs.puppetlabs.com/guides/configuring.html

http://369369.blog.51cto.com/319630/785895

http://puppet.wikidot.com/file

http://bbs.linuxtone.org/thread-22751-1-1.html

相關文章
相關標籤/搜索