如何將Puppet服務(wù)器及客戶端安裝到CentOS和RHEL上?
譯文由于系統(tǒng)管理員需要管理的系統(tǒng)越來(lái)越多,日常任務(wù)自動(dòng)化顯得相當(dāng)重要。于是,許多管理員采用了編寫(xiě)自定義腳本這種方法,這些腳本其實(shí)模擬復(fù)雜的調(diào)配軟件??蛇z憾的是,腳本會(huì)變得過(guò)時(shí),開(kāi)發(fā)腳本的人可能離開(kāi)了公司,要是沒(méi)有投入大量的精力來(lái)維護(hù),一段時(shí)間后這些腳本最終就會(huì)無(wú)法使用。一種更可取的方法無(wú)疑是共享一種人人都能使用的系統(tǒng),開(kāi)發(fā)不管某人的雇主是誰(shuí),都可以使用的工具。這方面有幾個(gè)系統(tǒng)可供我們使用,本文介紹如何使用其中一個(gè)系統(tǒng):Puppet。
何謂Puppet?
Puppet是一款面向IT系統(tǒng)管理員和咨詢?nèi)耸康淖詣?dòng)化軟件。它讓用戶可以自動(dòng)處理重復(fù)性任務(wù),比如安裝應(yīng)用程序和服務(wù)、補(bǔ)丁管理及部署。所有資源的配置都存儲(chǔ)在一個(gè)所謂的清單文件(manifest)里面,可以適用于多臺(tái)機(jī)器,或適用于僅僅一臺(tái)服務(wù)器。如果你想知道更多信息,The Puppet Labs網(wǎng)站更全面地描述了Puppet的性質(zhì)及其工作方式:https://puppetlabs.com/puppet/what-is-puppet/。
我們準(zhǔn)備在本教程中實(shí)現(xiàn)什么任務(wù)?
我們將安裝和配置一臺(tái)Puppet服務(wù)器,并為我們的客戶端服務(wù)器完成一些基本的配置。我們會(huì)介紹如何編寫(xiě)及管理Puppet清單文件以及如何將它發(fā)送到你的服務(wù)器上。
前提條件
由于Puppet不在基本的CentOS或RHEL發(fā)行版軟件庫(kù)中,我們只好添加由Puppet Labs提供的自定義軟件庫(kù)。在你想要使用Puppet的所有服務(wù)器上,安裝該軟件庫(kù),為此執(zhí)行下面這個(gè)命令(RPM文件名隨新版本而變化):
在CentOS/RHEL 6.5上:
- # rpm -ivh https://yum.puppetlabs.com/el/6.5/products/x86_64/puppetlabs-release-6-10.noarch.rpm
在CentOS/RHEL 7上:
- # rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm
服務(wù)器的安裝
將軟件包“puppet-server”安裝到你想用作主服務(wù)器的服務(wù)器上。
- # yum install puppet-server
安裝完畢后,設(shè)置Puppet服務(wù)器,以便在系統(tǒng)啟動(dòng)時(shí)自動(dòng)開(kāi)啟、并打開(kāi)它。
- # chkconfig puppetmaster on
- # service puppetmaster start
現(xiàn)在我們讓服務(wù)器運(yùn)行起來(lái)后,就要確保它能夠從我們的網(wǎng)絡(luò)加以訪問(wèn)。
在iptables用作防火墻的CentOS/RHEL 6上,將下面這一行添加到/etc/sysconfig/iptables的“:OUTPUT ACCEPT”這部分。
- 1 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -j ACCEPT
為了讓這個(gè)變更生效,有必要重啟iptables。
- # service iptables restart
在使用firewalld的CentOS/RHEL 7上,可以用下列命令實(shí)現(xiàn)同一操作:
- # firewall-cmd --permanent --zone=public --add-port=8140/tcp
- # firewall-cmd --reload
客戶端的安裝
將Puppet客戶端軟件包安裝到客戶端節(jié)點(diǎn)上,為此執(zhí)行下面這個(gè)命令:
- # yum install puppet
安裝完畢后,確保Puppet在系統(tǒng)啟動(dòng)后開(kāi)啟。
- # chkconfig puppet on
你的Puppet客戶端節(jié)點(diǎn)必須知道Puppet主服務(wù)器位于何處。為此,最佳辦法就是使用DNS服務(wù)器,你可以在該服務(wù)器上配置Puppet域名。要是你沒(méi)有一臺(tái)正常運(yùn)行的DNS服務(wù)器,可以使用/etc/hosts文件,為此只要添加下面這一行:
- 1.2.3.4 server.your.domain
- 2.3.4.5 client-node.your.domain
完成這些設(shè)置后,我們就要向Puppet客戶端表明誰(shuí)是主服務(wù)器。默認(rèn)情況下,Puppet尋找一臺(tái)名為“puppet”的服務(wù)器,但該設(shè)置通常不適合你的網(wǎng)絡(luò)配置,因此我們將它換成Puppet主服務(wù)器的完全符合標(biāo)準(zhǔn)的域名(FQDN)。打開(kāi)文件/etc/sysconfig/puppet,把“PUPPET_SERVER”值換成/etc/hosts中指定的Puppet主服務(wù)器域名:
- PUPPET_SERVER=server.your.domain
主服務(wù)器名稱也必須在/etc/puppet/puppet.conf的“[agent]”部分中加以定義:
- serverserver=server.your.domain
現(xiàn)在,你可以啟動(dòng)Puppet客戶端了:
- # service puppet start
我們需要使用下面這個(gè)命令,迫使客戶端聯(lián)系上Puppet主服務(wù)器:
- # puppet agent --test
你應(yīng)該會(huì)看到類(lèi)似下列輸出內(nèi)容的結(jié)果。別慌張,這很正常,因?yàn)樵摲?wù)器仍沒(méi)有在Puppet主服務(wù)器上得到驗(yàn)證。
- Exiting; no certificate found and waitforcert is disabled
回到你的puppet主服務(wù)器,核實(shí)證書(shū)驗(yàn)證請(qǐng)求:
- # puppet cert list
你應(yīng)該會(huì)看到一份列表,列出了從puppet主服務(wù)器請(qǐng)求證書(shū)簽名的所有服務(wù)器。找到客戶 服務(wù)器的主機(jī)名稱,使用下面這個(gè)命令來(lái)簽名(client-node是客戶端節(jié)點(diǎn)的域名):
- # puppet cert sign client-node
至此,你已有了一臺(tái)正常工作的Puppet客戶端和服務(wù)器。祝賀你!不過(guò),眼下Puppet主服務(wù)器無(wú)法指令客戶端進(jìn)行什么操作。所以,不妨創(chuàng)建某個(gè)基本的清單文件,并設(shè)置客戶端節(jié)點(diǎn)來(lái)安裝基本的實(shí)用工具。
連接回到Puppet服務(wù)器,確保目錄/etc/puppet/manifests已存在。
- # mkdir -p /etc/puppet/manifests
現(xiàn)在,創(chuàng)建具有下列內(nèi)容的清單文件/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服務(wù)。
- # service puppetmaster restart
客戶端配置的默認(rèn)刷新間隔時(shí)間是30分鐘;如果你想手動(dòng)強(qiáng)行讓變更生效,就要在客戶端節(jié)點(diǎn)上執(zhí)行下面這個(gè)命令:
- # puppet agent -t
如果你想更改默認(rèn)的客戶端刷新間隔時(shí)間,將下面這一行:
- runinterval = <yourtime>
添加到客戶端節(jié)點(diǎn)上的/etc/puppet/puppet.conf的“[agent]”部分。該設(shè)置是個(gè)時(shí)間間隔,單位可能是秒鐘(30或30s)、分鐘(
技巧和方法
1. 調(diào)試
有時(shí)候可能出現(xiàn)這種情況:你要提交錯(cuò)誤的配置,不得不調(diào)試Puppet在哪里出現(xiàn)了故障。為此,你總是可以從檢查/var/log/puppet/中的日志,或者手動(dòng)運(yùn)行代理軟件、查看輸出結(jié)果開(kāi)始入手:
- # puppet agent -t
默認(rèn)情況下,“-t”激活詳細(xì)模式,所以它讓你可以查看Puppet的輸出結(jié)果。該命令還有幾個(gè)參數(shù),可以幫助更細(xì)致一點(diǎn)地識(shí)別問(wèn)題。第一個(gè)實(shí)用的選項(xiàng)是:
- # puppet agent -t --debug
debug表明Puppet在運(yùn)行期間經(jīng)歷的所有步驟。它在調(diào)試非常復(fù)雜的規(guī)則的過(guò)程中大有用處??赡芎苡杏玫牧硪粋€(gè)參數(shù)是:
- # puppet agent -t --noop
該選項(xiàng)將puppet設(shè)置在所謂的空運(yùn)行(dry-run)模式,并不執(zhí)行任何變更。Puppet只是在屏幕上輸出所要呈現(xiàn)的內(nèi)容,并不將任何內(nèi)容寫(xiě)入到磁盤(pán)上。
2. 模塊
一段時(shí)間后,你會(huì)發(fā)現(xiàn)處于這種情形:你想要有更復(fù)雜的清單文件。但在你坐下來(lái)開(kāi)始編寫(xiě)清單文件之前,應(yīng)該花點(diǎn)時(shí)間,瀏覽https://forge.puppetlabs.com。Forge是個(gè)龐大的軟件庫(kù),里面含有諸多Puppet社區(qū)模塊;你很有可能在這里找到問(wèn)題的解決方法。要是沒(méi)找到,就編寫(xiě)自己的模塊,然后提交,那樣別人就能得益于Puppet模塊文化。
現(xiàn)在,假設(shè)你已經(jīng)找到了可以解決你問(wèn)題的一個(gè)模塊。那么,如何把它安裝到系統(tǒng)上?安裝其實(shí)相當(dāng)容易,因?yàn)?/span>Puppet已經(jīng)含有直接下載模塊的接口。只要鍵入下面這個(gè)命令:
- # puppet module install <module_name> --version 0.0.0
<module_name>是你所選擇模塊的名稱,version是可選的(要是沒(méi)有指定,那么下載最新版本。)如果你不記得想要安裝的那個(gè)模塊的名稱,可以試著使用module search(模塊搜索)來(lái)找到它:
- # puppet module search <search_string>
因而,你會(huì)獲得一份列表,列出了含有搜索字符串的所有模塊。
- # puppet module search apache
- Notice: Searching https://forgeapi.puppetlabs.com ...
- NAME DESCRIPTION AUTHOR KEYWORDS
- example42-apache Puppet module for apache @example42 example42, apache
- puppetlabs-apache Puppet module for Apache @puppetlabs apache web httpd centos rhel ssl wsgi proxy
- theforeman-apache Apache HTTP server configuration @theforeman foreman apache httpd DEPRECATED
如果你想看看已經(jīng)安裝了哪些模塊,只要鍵入下面這個(gè)命令:
- # puppet module list
結(jié)束語(yǔ)
至此,你應(yīng)該有了一個(gè)完全實(shí)用的Puppet主服務(wù)器,可以為一個(gè)或多個(gè)客戶端服務(wù)器提供基本的配置?,F(xiàn)在可以隨意為你的配置添加更多的設(shè)置,讓它適應(yīng)你的基礎(chǔ)設(shè)施。用不著為搗鼓Puppet而擔(dān)心,你會(huì)發(fā)現(xiàn)它確實(shí)大有幫助。
Puppet實(shí)驗(yàn)室在努力為其項(xiàng)目維護(hù)最高質(zhì)量的說(shuō)明文檔,所以如果你想進(jìn)一步了解Puppet及其配置,本人強(qiáng)烈建議訪問(wèn)Puppet項(xiàng)目的網(wǎng)頁(yè):http://docs.puppetlabs.com。
要是你有任何問(wèn)題,歡迎在下面留言,本人會(huì)盡量給予解答或給出建議。