當手中有至關多的機器須要管理的時候,自動化處理冗餘又無聊的任務對系統管理員來講就很重要了。不少管理員習慣了本身寫腳本模擬複雜軟件之間的調度。不幸的是,腳本會過期,腳本的做者會離職,若是不花費巨大精力來維護這些腳本的話,它們遲早會一點兒用也沒有。若是能有一個系統,任何人均可以使用、安裝工具,不論其受僱於何人,那真是太期待了。目前已有幾種系統能夠解決這類需求,這篇教程將介紹其中之一——Puppet——的使用方法。node
Puppet 是一款爲 IT 系統管理員和顧問們設計的自動化軟件,你能夠用它自動化地完成諸如安裝應用程序和服務、補丁管理和部署等工做。全部資源的相關配置都以「manifests」的方式保存,單臺機器或者多臺機器均可以使用。若是你想了解更多內容,Puppet 實驗室的網站上有關於 Puppet 及其工做原理的更詳細的介紹。web
在這篇教程裏,咱們將一塊兒安裝配置一個 Puppet 服務器,而後在咱們的客戶端服務器(譯註:這裏的「客戶端服務器」指須要部署業務邏輯的服務器)上完成一些基本配置。apache
因爲 Puppet 不是 CentOS 或 RHEL 發行版的基本倉庫,因此咱們得手動添加 Puppet 實驗室提供的自定義倉庫。在全部你想使用 Puppet 的地方執行如下命令安裝這個倉庫(版本不一樣,對應的 RPM 文件名可能略有不一樣)。vim
對於 CentOS/RHEL 6.5:centos
# rpm -ivh https://yum.puppetlabs.com/el/6.5/products/x86_64/puppetlabs-release-6-10.noarch.rpm
對於 CentOS/RHEL 7:api
# rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm
在你打算用做 master 的服務器上安裝 "puppet-server" 包。服務器
# yum install puppet-server
安裝完成後,設置 Puppet 服務器開機自動啓動,而後啓動它。網絡
# chkconfig puppetmaster on# service puppetmaster start
如今服務器已經運行起來了,咱們試試看咱們的網絡能不能訪問到它。dom
對於使用 iptables 當作防火牆的 CentOS/RHEL 6,在 /etc/sysconfig/iptables 文件的 OUTPUT ACCEPT 小節裏添加下面這一行。tcp
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -j ACCEPT
從新啓動 iptables 服務讓剛纔的修改生效。
# service iptables restart
在安裝了防火牆的 CentOS/RHEL 7 上,咱們這麼作:
# firewall-cmd --permanent --zone=public --add-port=8140/tcp# firewall-cmd --reload
執行下面的命令,在客戶端節點安裝 Puppet 客戶端。
# yum install puppet
安裝完成後,確保 Puppet 會隨開機自動啓動。
# chkconfig puppet on
Puppet 客戶端須要知道 Puppet master 服務器的地址。最佳方案是使用 DNS 服務器解析 Puppet master 服務器地址。若是你沒有 DNS 服務器,在 /etc/hosts 裏添加相似下面這幾行也能夠:
1.2.3.4 server.your.domain
2.3.4.5 client-node.your.domain
1.2.3.4 對應你的 Puppet master 服務器 IP 地址,「server.your.domain」是你的 master 服務器域名(默認一般是服務器的 hostname),「client-node.your.domain」是你的客戶端節點。包括 Puppet master 和客戶端,全部相關的服務器都要在 hosts 文件裏配置。
完成這些設置以後,咱們要讓 Puppet 客戶端知道它的 master 是誰。默認狀況下,Puppet 會查找名爲「puppet」的服務器,但一般這並不符合你網絡環境的真實狀況,因此咱們要改爲 Pupper master 服務器的完整域名。打開文件 /etc/sysconfig/puppet,把 PUPPET_SERVER 變量的值改爲你在 /etc/hosts 文件裏指定的 Puppet master 服務器的域名。
PUPPET_SERVER=server.your.domain
master 服務器名也要在 /etc/puppet/puppet.conf 文件的「[agent]」小節裏事先定義好。
server=server.your.domain
如今能夠啓動 Puppet 客戶端了:
# service puppet start
強制咱們的客戶端在 Puppet master 服務器上登記:
# puppet agent --test
你會看到相似於下面的輸出。別怕,這是正常現象,由於服務器尚未在 Puppet master 服務器上驗證過。
Exiting; no certificate found and waitforcert is disabled
返回 Puppet master 服務器,檢查證書驗證請求:
# puppet cert list
你應該能看到一個列出了全部向 Puppet master 服務器發起證書籤名請求的服務器。找到你客戶端服務器的 hostname 而後使用下面的命令簽名(client-node 是你客戶端節點的域名):
# puppet cert sign client-node
到此爲止 Puppet 客戶端和服務器都正常工做了。恭喜你!可是,如今 Puppet master 沒有任何要客戶端作的事兒。好吧,咱們來建立一些基本的 manifest 文件而後讓咱們的客戶端節點安裝一些基本工具。
回到你的 Puppet 服務器,確保目錄 /etc/puppet/manifests 存在。
# mkdir -p /etc/puppet/manifests
建立 manifest 文件 /etc/puppet/manifests/site.pp,內容以下
node 'client-node' { include custom_utils} class custom_utils { package { ["nmap","telnet","vim-enhanced","traceroute"]: ensure => latest, allow_virtual => false, }}
而後從新啓動 puppetmaster 服務。
# service puppetmaster restart
客戶端默認每 30 分鐘更新一次配置,若是你但願你的修改能強制生效,就在客戶端執行以下命令:
# puppet agent -t
若是你須要修改客戶端的默認刷新時間,編輯客戶端節點的 /etc/puppet/puppet.conf 文件中「[agent]」小節,增長下面這一行:
runinterval =
這個選項的值能夠是秒(格式好比 30 或者 30s),分鐘(30m),小時(6h),天(2d)。值得注意的是,0 意味着「當即執行」而不是「從不執行」。
你免不了會提交錯誤的配置,而後不得不經過調試判斷問題出如今哪兒。通常來講,你要麼經過查看日誌文件 /var/log/puppet 着手解決問題,要麼手動執行查看輸出:
# puppet agent -t
使用「-t」選項,你能夠看到 Puppet 的詳細輸出。這條命令還有額外的選項能夠幫你定位問題。首先要介紹的選項是:
# puppet agent -t --debug
debug 選項會顯示 Puppet 本次運行時的差很少每個步驟,這在調試很是複雜的問題時頗有用。另外一個頗有用的選項是:
# puppet agent -t --noop
這個選項讓 puppet 工做在 dry-run(譯註:空轉模式,不會對真實環境產生影響)模式下,不會應用任何修改。Puppet 只會把其工做內容輸出到屏幕上,不會寫到磁盤裏去。
有時候你須要更復雜的 manifest 文件,在你着手編寫它們以前,Forge 是一個集合了 Puppet 模塊的社區,你有必要花點兒時間瀏覽一下 https://forge.puppetlabs.com。
如今,假設你已經找到了一個模塊能解決你的問題。怎麼把它安裝到你的系統中去呢?很是簡單,由於 Puppet 已經有了能夠直接下載模塊的用戶界面,只須要執行下面的命令:
# puppet module install <module_name> --version 0.0.0
<module_name> 是你選擇的模塊的名字,版本號可選(若是沒有指定版本號,默認使用最新的版本)。若是你不記得想安裝的模塊的名字了,試試下面的命令搜索模塊:
# puppet module search <search_string>
你會獲得一個包含 search_string 的列表。
# puppet module search apache
Notice: Searching https://forgeapi.puppetlabs.com ...NAME DESCRIPTION AUTHOR KEYWORDSexample42-apache Puppet module for apache @example42 example42, apachepuppetlabs-apache Puppet module for Apache @puppetlabs apache web httpd centos rhel ssl wsgi proxytheforeman-apache Apache HTTP server configuration @theforeman foreman apache httpd DEPRECATED
若是你想查看已經安裝了哪些模塊,鍵入:
# puppet module list
到目前爲止,你應該有了功能完整的能夠向一個或多個客戶端服務器推送基本配置的 Puppet master 服務器。你能夠本身隨便加點兒配置適配你本身的網絡環境。沒必要爲試用 Puppet 擔憂,你會發現,它會拯救你的生活。