有關伺服器的自動化管理,這方面以前沒有接觸過。打算這段時間把這塊知識給補上。
現在伺服器自動化管理軟體,使用最多也最火的就是puppet了。
那麼我們今天的主角也就是puppet。分以下幾個步驟來介紹:
1、 puppet是什麼
2、 puppet優點
3、 安裝準備工作
4、 環境準備
5、 源碼安裝puppet
6、 rpm安裝puppet
7、 puppet證書授權
8、 puppet資源
puppet是一種基于ruby語言開發的lnux、unix、windows平台的集中配置管理系統。它使用自有的puppet描述語言,可管理配置檔案file、使用者user、cron任務、軟體包、系統服務等系統實體。
puppet把這些系統實體稱之為資源,puppet設計目标是簡化對這些資源的管理以及妥善處理資源間的依賴關系。
puppet依賴于c/s(用戶端/伺服器)的部署架構。它需要在puppet伺服器上安裝puppet-server軟體包(以下簡稱master),在需要管理的目标主機上安裝puppet用戶端軟體(以下簡稱agent)。
當agent連接配接上master後,定義在master端的配置檔案會被編譯,然後在agent上運作。每個agent預設30分鐘會連接配接一次master,确認配置資訊的更新情況。但是這種方式在很多場景下不是很符合系統管理者的要求,是以很多系統管理者也會将agent通過crontab(任務計劃)來管理,這樣會更加靈活一些。
puppet的文法允許你建立一個單獨的腳本,用來在你所有的目标主機上建立一個使用者。所有的目标主機會依次使用适合本地系統的文法來解釋和執行這個子產品。如果這個配置是在red hat伺服器上執行的話,建立使用者使用useradd指令,如果這個配置是在freddbsd伺服器上執行的話,則使用adduser指令。
puppet另外一個卓越的地方就是它的靈活性。源于開源軟體的天性,你可以自由地獲得puppet的源代碼。如果你遇到問題并且有能力處理的話,你可以修改或加強puppet的代碼使其适用于你的環境,然後解決這個問題。
puppet也是易于擴充的。定制軟體包的支援功能和特殊的系統環境配置能夠快速簡單地添加至puppet的安裝程式中。
本次實驗os為centos 6.5 64bit,服務端為:192.168.199.247,用戶端為192.168.199.248。
在正式實驗之前,我們有幾個事情需要先進行處理。
為了減少在實驗過程中不必要的麻煩,我們需要對所有主機(包括伺服器和用戶端)進行時間同步。即伺服器與用戶端的時間相差不能超過秒級。
使用以下指令進行時間同步,如下:
ntpdate timekeeper.isi.edu
如果在進行時間同步時,出現如下錯誤:
21 jan 17:20:45 ntpdate[2720]: the ntp socket is in use, exiting
請關閉主機的ntpd服務,然後再進行時間同步。
/etc/init.d/ntpd stop
因為安裝 puppet 時會把主機名寫入證書,同時用戶端和服務端之間通信需要這個證書。是以需要修改伺服器與用戶端的主機名。
修改主機名。如下:
hostname s.ilanni.com
執行此指令,可以使主機的主機名立即生效。但是伺服器重新開機後,此修改就會失效。
要是主機名永久生效的話,需要修改/etc/sysconfig/network檔案。如下:
cat /etc/sysconfig/network
本次實驗,我們就不搭建dns伺服器,直接通過修改服務端與用戶端的hosts檔案來達到各自解析域名的目的。如下:
cat /etc/hosts
192.168.199.247 s.ilanni.com
192.168.199.248 c.ilanni.com
<b>3.3 </b><b>關閉iptables和selinux</b>
我們現在所有的實驗都是在關閉iptables和selinux下進行的。
/etc/init.d/iptables status
cat /etc/selinux/config
puppet的安裝可以分為源碼安裝和rpm安裝,但是無論哪一種安裝方法,我們都需要在安裝之前對其進行幾點需要說明。
1、由于puppet是采用ruby語言開發,是以無論是源碼還是rpm方式安裝puppet,我們都必須要先安裝ruby語言環境
2、puppet從2.7版本以後,就需要hiera的支援。是以也必須安裝hiera。
3、在前面章節中,我們說明了puppet是一個配置管理系統,而管理的資源,都是系統的實體。但是這些實體,是如何來的呢?這就需要我們安裝另外一個資源收集軟體—facter。
facter主要用來收集主機的一些資訊,比如:cpu、主機ip等。facter把這些收集的資訊發送給puppet伺服器端,伺服器端就可以根據不同的條件來對不同的節點機器生成不同的puppet配置檔案。
facter也是ruby語言開發的,這個我們可以在facter的安裝文檔中可以檢視到,如下:
cat readme.md
ruby的安裝比較簡單,我們在此使用是yum進行安裝。如下:
yum -y install ruby
ruby安裝完畢後,我們來檢視其生成的檔案。如下:
rpm -ql ruby
我們可以檢視ruby的幫助資訊,如下:
ruby -h
除此之外,我們還要安裝ruby-rdoc這個軟體包。該軟體包主要用于檢視ruby的幫助文檔。如下:
yum -y install ruby-rdoc
以上就是和ruby有關的軟體包,安裝完畢後,我們開始來安裝facter。
facter我們可以從puppet官網下載下傳,如下:
http://downloads.puppetlabs.com/facter/
注意:facter也可以通過yum進行安裝,在此我們使用的是源碼安裝。
下載下傳facter最新的版本,如下:
wget http://downloads.puppetlabs.com/facter/facter-2.3.0.tar.gz
解壓facter軟體包,如下:
tar -xf facter-2.3.0.tar.gz
開始安裝facter,如下:
ruby install.rb或者./install.rb
facter安裝完畢後,我們來檢視下facter的使用幫助。如下:
facter -h
如果想檢視facter詳細幫助資訊,我們也可以man下facter。如下:
man facter
如果安裝沒有問題的話,我們在執行facter指令後,會顯示facter收集的相關資訊。如下:
facter
hiera主要用于控制一些agent經常變化的數值,在puppet2.7以後的版本必須要安裝。如果不安裝的話,我們在安裝puppet時,系統會提示如下錯誤:
could not load hiera; cannot install
但是在安裝hiera之前,我們必須安裝額外的yum源,否則系統會提示找不到該軟體包。
該yum源,我們可以puppet官網檢視到。如下:
https://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#for-red-hat-enterprise-linux-and-derivatives
按照puppet官網的方法進行安裝。如下:
rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
yum源配置完畢後,我們現在來安裝hiera。如下:
yum -y install hiera
以上安裝完畢後,我們就可以正式安裝puppet。
<b>puppet</b><b>服務端與用戶端的源碼安裝使用的是同一個軟體包,安裝步驟一樣,隻是在配置檔案方面有細微的差别。</b>
在下載下傳puppet源碼之前,我們還要在master端和agent端建立puppet運作時使用的使用者puppet。master端如果不建立的話,master在啟動時,會報如下錯誤:
建立puppet使用者,如下:
useradd -m -s /sbin/nologin puppet
cat /etc/passwd |grep puppet
<b>注意:puppet服務端是以puppet使用者運作的,而puppet用戶端是root使用者運作。</b>
<b>這樣做的目的是:master在服務端以普通使用者運作安全性比較高,而agent在用戶端以root使用者運作,是因為master在建立使用者、修改系統檔案等資源時,需要具有最高權限。</b>
<b>5.1 puppet</b><b>源碼安裝</b>
puppet的源碼包,我們可以從puppet官網下載下傳。目前puppet最新版為3.7.3.如下:
<a href="http://downloads.puppetlabs.com/puppet/">http://downloads.puppetlabs.com/puppet/</a>
下載下傳puppet軟體包。如下:
解壓puppet軟體包,如下:
tar -xf puppet-3.7.3.tar.gz
puppet的安裝方法與facter的安裝一樣,如下:
puppet安裝完畢後,我們來檢視下其幫助資訊,如下:
puppet help
檢視puppet的安裝位置如下:
ll /etc/puppet/
以上就是puppet的安裝,安裝完畢後。我們現在來配置puppet。
puppet安裝完畢後,我們來配置下master端。把puppet源碼包ext/redhat/目錄下的puppet.conf檔案複制到puppet的安裝目錄/etc/puppet/下,如下:
cp ext/redhat/puppet.conf /etc/puppet/
vi /etc/puppet/puppet.conf
server = s.ilanni.com
certname = s.ilanni.com
pluginsync = false
其中s.ilanni.com表示puppet伺服器的主機名。
pluginsync = false表示關閉子產品中的插件功能
配置檔案修改完畢後,我們現在來配置master端的啟動腳本。
複制puppet源碼包ext/redhat/目錄下的server.init檔案到/etc/init.d/下,并重命名為puppetmaster。然後賦予puppetmaster可執行權限。如下:
cp ext/redhat/server.init /etc/init.d/puppetmaster
chmod u+x /etc/init.d/puppetmaster
注意:master端啟動,我們也可以通過puppet master指令來啟動。如下:
puppet master
netstat -tunlp |grep "8140"
ps aux |grep puppet
其實puppetmaster啟動腳本就是使用puppet master指令啟動的,如下:
cat /etc/init.d/puppetmaster
把puppetmaster加入到開機啟動項。如下:
chkconfig –add puppetmaster
chkconfig puppetmaster on
chkconfig |grep puppetmaster
以上都配置完畢後,我們來啟動puppet服務,如下:
/etc/init.d/puppetmaster start
netstat -tunlp
通過上圖,我們可以很puppet服務使用tcp協定的8140端口,而且運作時使用puppet使用者。
puppet服務端配置完畢後,我們現在來配置puppet用戶端。
agent端的配置,隻需要把puppet.conf檔案複制到puppet的安裝目錄/etc/puppet/下即可,如下:。
cat /etc/puppet/puppet.conf
agent端啟動,我們可以通過puppet agent指令來啟動。如下:
puppet agent
通過上圖,我們也可以看出agent端運作時使用的使用者為root,而不是puppet使用者。
<b>注意:agent端我們使用puppet agent指令來進行各種管理,包括證書的申請、資源的同步,我們都是通過這個指令進行的。</b>
<b>agent</b><b>可以以兩種方式運作:第一種方式是指令接參數連接配接master,第二種是以守護程序的形式在系統背景運作,預設每30分鐘連接配接一次master,但是這樣并不靈活。我們一般是使用第一種方式,并配合crontab使用。</b>
<a><b>六、 rpm安裝puppet</b></a>
rpm方式安裝puppet比較簡單,我們隻需yum安裝即可。如下:
<b>6.1 puppet</b><b>安裝準備工作</b>
在使用rpm安裝之前,我們要先配置額外的yum源,否則系統會提示找不到puppet軟體包。如下:
yum -y install puppet-server
安裝額外的yum源,我們可以在puppet的官網查找到yum源。如下:
<b>注意:該yum源無論是master端和agent端都需要進行配置。</b>
<b>6.2 master</b><b>端安裝與配置</b>
現在開始yum安裝master端,如下:
通過上圖,我們可以看到安裝puppet-server是要依賴于facter、hiera和puppet三個軟體包。
現在我們來檢視puppet-server安裝時建立的使用者以及puppet服務運作時所用的使用者,如下:
cat /etc/passwd
通過上圖,我們可以看到puppet-server在安裝時确實建立使用者puppet,以及在運作時使用的确實puppet使用者。
檢視puppet服務所使用的端口,如下:
master端安裝完畢後,我們來配置puppet服務的配置檔案,其方法和源碼安裝方法一樣。如下:
<b>6.3 agent</b><b>端安裝與配置</b>
master端安裝完畢後,我們來安裝agent端如下:
yum -y install puppet
rpm安裝的puppet用戶端與源碼安裝的一樣,我們現在來啟動puppet用戶端。如下:
通過上圖,我們可以看出agent端安裝時也建立了puppet使用者,但是puppet運作時沒有使用該使用者而是使用root使用者。這個與源碼安裝的相對應。
agent端安裝完畢後,我們來配置agent端的配置檔案,其方法和源碼安裝方法一樣。如下:
<b>七、 puppet證書授權</b>
我們知道puppet為了安全,采用ssl隧道通信,是以需要申請證書來驗證。
<b>7.1 master</b><b>端證書初始化</b>
當master端第一次啟動的時候,可以檢視/var/log/message日志檔案中,有類似如下的資訊:
tail -f /var/log/messages
jan 23 06:39:03 localhost puppet-master[1622]: signed certificate request for ca
jan 23 06:39:04 localhost puppet-master[1622]: s.ilanni.com has a waiting certificate request
jan 23 06:39:04 localhost puppet-master[1622]: signed certificate request for s.ilanni.com
jan 23 06:39:04 localhost puppet-master[1622]: removing file puppet::ssl::certificaterequest s.ilanni.com at ‘/var/lib/puppet/ssl/ca/requests/s.ilanni.com.pem’
jan 23 06:39:04 localhost puppet-master[1622]: removing file puppet::ssl::certificaterequest s.ilanni.com at ‘/var/lib/puppet/ssl/certificate_requests/s.ilanni.com.pem’
jan 23 06:39:04 localhost puppet-master[1634]: reopening log files
jan 23 06:39:04 localhost puppet-master[1634]: starting puppet master version 3.7.3
從日志中我們可以看出第一次啟動master端時,puppet服務會在本地建立認證中心,給自己授權證書和key,這個我們可以在/var/lib/puppet/ssl看到那些證書和key。如下:
ll /var/lib/puppet/ssl
這個目錄和/etc/puppet/puppet.conf檔案中配置的ssldir路徑有關系。
我們也可以檢視master端給自己授權的證書檔案,如下:
ll /var/lib/puppet/ssl/ca/signed
<b>7.2 agent</b><b>端申請證書</b>
agent端在第一次連接配接master端時,會向master端申請證書。如果master端沒有授予agent端證書,那麼agent端和master端之間的連接配接是不會建立成功的。
此時agent端會持續等待master端授權證書,并會每隔2分鐘去檢查master端是否簽發證書。
我們現在使用puppet agent –server s.ilanni.com連接配接master端,如下:
puppet agent –server s.ilanni.com
<b>7.3 master</b><b>端授權證書</b>
agent端申請證書完畢後,需要我們切換到master端,使用puppet cert指令來對agent端授權證書。
有關puppet cert的使用,我們可以檢視pupper cert的幫助資訊。如下:
pupper cert
在上圖中,puppet cert已經給出如何給一個agent端進行授權證書的例子。
現在我們來檢視master端有哪些主機在申請證書,如下:
puppet cert list
通過上圖,我們很明顯的可以看到c.ilanni.com用戶端正在申請證書。
現在我們來給agent端授權證書,使用如下指令:
puppet cert sign c.ilanni.com
注意:如果實際生産環境用戶端數量比較多的話,我們可以一次性授權所有證書。如下:
puppet cert sign –all
在master端檢視所有已經通過認證的agent端,如下:
puppet cert -all
現在我們再來看看master端給agent端授權的證書檔案,如下:
通過上圖,我們可以看出master端授權用戶端c.ilanni.com的證書檔案是c.ilanni.com.pem。
<b>7.4 </b><b>檢視agent端證書</b>
在master端授權完畢後,我們現在切換到agent端檢視授權的證書檔案,如下:
ll /var/lib/puppet/ssl/certs
通過上圖,我們可以看出agent端的證書檔案c.ilanni.com.pem與master端的證書檔案是一樣的。
<b>7.5 puppet</b><b>證書問題</b>
在實際的生産環境中,可能會出現已經通過master端認證的agent端主機名被修改或者其他一些誤操作,進而導緻agent端無法與master端進行正常通信。
當遇到這種情況時,我們一般的處理方法是先删除master端和agent端的相關的認證檔案,然後在agent端重新申請證書。
具體操作如下:
agent端,删除/var/lib/puppet/ssl目錄,如下:
rm -fr /var/lib/puppet/ssl
master端,删除/var/lib/puppet/ssl/ca/signed目錄下的證書檔案,如下:
rm -fr /var/lib/puppet/ssl/ca/signed/c.ilanni.com.pem
以上操作完畢後,agent端再次申請證書即可。
<b>八、 puppet資源</b>
puppet環境搭建完畢後,我們現在開始來介紹puppet資源相關的内容。
<b>8.1 puppet</b><b>的資源類型及幫助</b>
puppet的資源,我們是可以通過相關指令檢視puppet支援的資源類型。
通過前面的章節,我們知道puppet是支援子指令進行查詢的。如下:
puppet help ca
檢視puppet支援的資源類型。如下:
puppet describe –list
也可以通過puppet resource –type指令查詢,如下:
puppet resource –type
通過上圖,我們可以看到puppet支援使用者user、檔案file、crontab等大部分的資源。
如果想檢視user的資源,我們還是繼續使用puppet describe user指令進行檢視。如下:
puppet describe user
如果我們想檢視user在puppet站點site.pp檔案中的具體使用方法,可以通過如下指令進行檢視:
puppet resource user
通過上圖,我們可以看到puppet已經給出了user使用的例子,我們隻需要按照這個例子進行操作即可。
注意:如果puppet describe幫助中沒有該資源在site.pp站點中的使用詳情,我們可以去到puppet resource中進行檢視。
這個隻是以user資源為例,如果想檢視host資源的幫助,我們也可以使用類似的指令,如下:
puppet resource host
如果你不想在本機進行檢視,那麼也可以去puppet官網進行檢視,如下:
<a href="https://docs.puppetlabs.com/references/latest/type.html">https://docs.puppetlabs.com/references/latest/type.html</a>
<b>8.2 puppet</b><b>資源配置檔案</b>
puppet的資源配置檔案在服務端的/etc/puppet/manifests目錄下,我們需要在該目錄下建立一個站點檔案site.pp。
我們在該檔案中建立需要同步到agent端的資源,如下:
cat /etc/puppet/manifests/site.pp
node default{
file { "/tmp/test.txt":
content => "hello,ilanni,this is puppet test!\n"}
}
以上指令表示在puppet資源配置檔案沖建立一個預設節點,使用file資源,在agent端的/tmp/目錄下建立test.txt,内容為:hello,ilanni,this is puppet test!\n
注意:其中的\n表示換行。如果不加\n的話,檢視該檔案内容時會顯示成這樣:
同時site.pp檔案建立完畢後,我們要先重新開機下master端,如下:
/etc/init.d/puppetmaster restart
現在切換到agent端同步該資源,如下:
puppet agent –test –server s.ilanni.com
通過上圖,我們可以看到agent端已經把master端的資源的同步到本地。
現在我們來檢視,agent端的/tmp目錄下是否有test.txt這個檔案。如下:
cat /tmp/test.txt
通過上圖,我們可以看到agent端确實已經同步到master端的資源。/tmp目錄下确實有test.txt這個檔案,而且内容也确實和master端的一樣。
到此有關puppet3.7搭建與配置介紹完畢,下一篇文章我們會介紹在生産環境中,puppet同步的資源。