爛泥:puppet3.7安裝與配置

本文首發於爛泥行天下

有關服務器的自動化管理,這方面以前沒有接觸過。打算這段時間把這塊知識給補上。

現在服務器自動化管理軟件,使用最多也最火的就是puppet了。

那麼我們今天的主角也就是puppet。分以下幾個步驟來介紹:

1、 puppet是什麼

2、 puppet優點

3、 安裝準備工作

4、 環境準備

5、 源碼安裝puppet

6、 RPM安裝puppet

7、 puppet證書授權

8、 puppet資源

一、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優點

puppet的語法允許你創建一個單獨的腳本,用來在你所有的目標主機上建立一個用戶。所有的目標主機會依次使用適合本地系統的語法來解釋和執行這個模塊。如果這個配置是在Red Hat服務器上執行的話,建立用戶使用useradd命令,如果這個配置是在FreddBSD服務器上執行的話,則使用adduser命令。

puppet另外一個卓越的地方就是它的靈活性。源於開源軟件的天性,你可以自由地獲得puppet的源代碼。如果你遇到問題並且有能力處理的話,你可以修改或加強puppet的代碼使其適用於你的環境,然後解決這個問題。

puppet也是易於擴展的。定製軟件包的支持功能和特殊的系統環境配置能夠快速簡單地添加至puppet的安裝程序中。

三、安裝準備工作

本次實驗OS爲centos 6.5 64bit,服務端爲:192.168.199.247,客戶端爲192.168.199.248。

在正式實驗之前,我們有幾個事情需要先進行處理。

3.1 主機時間同步

爲了減少在實驗過程中不必要的麻煩,我們需要對所有主機(包括服務器和客戶端)進行時間同步。即服務器與客戶端的時間相差不能超過秒級。

使用以下命令進行時間同步,如下:

ntpdate timekeeper.isi.edu

clip_p_w_picpath001

如果在進行時間同步時,出現如下錯誤:

21 Jan 17:20:45 ntpdate[2720]: the NTP socket is in use, exiting

clip_p_w_picpath002

請關閉主機的ntpd服務,然後再進行時間同步。

/etc/init.d/ntpd stop

clip_p_w_picpath003

3.2 修改主機名

因爲安裝 puppet 時會把主機名寫入證書,同時客戶端和服務端之間通信需要這個證書。所以需要修改服務器與客戶端的主機名。

修改主機名。如下:

hostname s.ilanni.com

執行此命令,可以使主機的主機名立即生效。但是服務器重啓後,此修改就會失效。

clip_p_w_picpath004

要是主機名永久生效的話,需要修改/etc/sysconfig/network文件。如下:

cat /etc/sysconfig/network

clip_p_w_picpath005

本次實驗,我們就不搭建DNS服務器,直接通過修改服務端與客戶端的hosts文件來達到各自解析域名的目的。如下:

cat /etc/hosts

192.168.199.247 s.ilanni.com

192.168.199.248 c.ilanni.com

clip_p_w_picpath006

3.3 關閉iptables和selinux

我們現在所有的實驗都是在關閉iptables和selinux下進行的。

/etc/init.d/iptables status

cat /etc/selinux/config

clip_p_w_picpath007

四、環境準備

puppet的安裝可以分爲源碼安裝和RPM安裝,但是無論哪一種安裝方法,我們都需要在安裝之前對其進行幾點需要說明。

4.1 puppet安裝說明

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

clip_p_w_picpath008

4.2 安裝ruby

ruby的安裝比較簡單,我們在此使用是yum進行安裝。如下:

yum -y install ruby

clip_p_w_picpath009

ruby安裝完畢後,我們來查看其生成的文件。如下:

rpm -ql ruby

clip_p_w_picpath010

我們可以查看ruby的幫助信息,如下:

ruby -h

clip_p_w_picpath011

除此之外,我們還要安裝ruby-rdoc這個軟件包。該軟件包主要用於查看ruby的幫助文檔。如下:

yum -y install ruby-rdoc

clip_p_w_picpath012

以上就是和ruby有關的軟件包,安裝完畢後,我們開始來安裝facter。

4.3 安裝facter

facter我們可以從puppet官網下載,如下:

http://downloads.puppetlabs.com/facter/

clip_p_w_picpath013

注意:facter也可以通過yum進行安裝,在此我們使用的是源碼安裝。

下載facter最新的版本,如下:

wget http://downloads.puppetlabs.com/facter/facter-2.3.0.tar.gz

clip_p_w_picpath014

解壓facter軟件包,如下:

tar -xf facter-2.3.0.tar.gz

clip_p_w_picpath015

開始安裝facter,如下:

ruby install.rb或者./install.rb

clip_p_w_picpath016

clip_p_w_picpath017

facter安裝完畢後,我們來查看下facter的使用幫助。如下:

facter -h

clip_p_w_picpath018

如果想查看facter詳細幫助信息,我們也可以man下facter。如下:

man facter

clip_p_w_picpath019

如果安裝沒有問題的話,我們在執行facter命令後,會顯示facter收集的相關信息。如下:

facter

clip_p_w_picpath020

4.4 安裝hiera

hiera主要用於控制一些agent經常變化的數值,在puppet2.7以後的版本必須要安裝。如果不安裝的話,我們在安裝puppet時,系統會提示如下錯誤:

Could not load hiera; cannot install

clip_p_w_picpath021

但是在安裝hiera之前,我們必須安裝額外的yum源,否則系統會提示找不到該軟件包。

該yum源,我們可以puppet官網查看到。如下:

https://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#for-red-hat-enterprise-linux-and-derivatives

clip_p_w_picpath022

按照puppet官網的方法進行安裝。如下:

rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

clip_p_w_picpath023

yum源配置完畢後,我們現在來安裝hiera。如下:

yum -y install hiera

clip_p_w_picpath024

以上安裝完畢後,我們就可以正式安裝puppet。

五、 源碼安裝puppet

puppet服務端與客戶端的源碼安裝使用的是同一個軟件包,安裝步驟一樣,只是在配置文件方面有細微的差別。

在下載puppet源碼之前,我們還要在master端和agent端創建puppet運行時使用的用戶puppet。master端如果不創建的話,master在啓動時,會報如下錯誤:

clip_p_w_picpath025

創建puppet用戶,如下:

useradd -M -s /sbin/nologin puppet

cat /etc/passwd |grep puppet

clip_p_w_picpath026

注意:puppet服務端是以puppet用戶運行的,而puppet客戶端是root用戶運行。

這樣做的目的是:master在服務端以普通用戶運行安全性比較高,而agent在客戶端以root用戶運行,是因爲master在創建用戶、修改系統文件等資源時,需要具有最高權限。

5.1 puppet源碼安裝

puppet的源碼包,我們可以從puppet官網下載。目前puppet最新版爲3.7.3.如下:

http://downloads.puppetlabs.com/puppet/

clip_p_w_picpath027

下載puppet軟件包。如下:

wget http://downloads.puppetlabs.com/puppet/puppet-3.7.3.tar.gz

clip_p_w_picpath028

解壓puppet軟件包,如下:

tar -xf puppet-3.7.3.tar.gz

clip_p_w_picpath029

puppet的安裝方法與facter的安裝一樣,如下:

ruby install.rb或者./install.rb

clip_p_w_picpath030

puppet安裝完畢後,我們來查看下其幫助信息,如下:

puppet help

clip_p_w_picpath031

查看puppet的安裝位置如下:

ll /etc/puppet/

clip_p_w_picpath032

以上就是puppet的安裝,安裝完畢後。我們現在來配置puppet。

5.2 master端配置

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表示關閉模塊中的插件功能

clip_p_w_picpath033

clip_p_w_picpath034

配置文件修改完畢後,我們現在來配置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

clip_p_w_picpath035

注意:master端啓動,我們也可以通過puppet master命令來啓動。如下:

puppet master

netstat -tunlp |grep "8140"

ps aux |grep puppet

clip_p_w_picpath036

其實puppetmaster啓動腳本就是使用puppet master命令啓動的,如下:

cat /etc/init.d/puppetmaster

clip_p_w_picpath037

把puppetmaster加入到開機啓動項。如下:

chkconfig --add puppetmaster

chkconfig puppetmaster on

chkconfig |grep puppetmaster

clip_p_w_picpath038

以上都配置完畢後,我們來啓動puppet服務,如下:

/etc/init.d/puppetmaster start

ps aux |grep puppet

netstat -tunlp

clip_p_w_picpath039

通過上圖,我們可以很puppet服務使用TCP協議的8140端口,而且運行時使用puppet用戶。

puppet服務端配置完畢後,我們現在來配置puppet客戶端。

5.3 agent端配置

agent端的配置,只需要把puppet.conf文件複製到puppet的安裝目錄/etc/puppet/下即可,如下:。

cp ext/redhat/puppet.conf /etc/puppet/

cat /etc/puppet/puppet.conf

server = s.ilanni.com

pluginsync = false

其中s.ilanni.com表示puppet服務器的主機名。

pluginsync = false表示關閉模塊中的插件功能

clip_p_w_picpath040

agent端啓動,我們可以通過puppet agent命令來啓動。如下:

puppet agent

ps aux |grep puppet

clip_p_w_picpath041

通過上圖,我們也可以看出agent端運行時使用的用戶爲root,而不是puppet用戶。

注意:agent端我們使用puppet agent命令來進行各種管理,包括證書的申請、資源的同步,我們都是通過這個命令進行的。

agent可以以兩種方式運行:第一種方式是命令接參數連接master,第二種是以守護進程的形式在系統後臺運行,默認每30分鐘連接一次master,但是這樣並不靈活。我們一般是使用第一種方式,並配合crontab使用。

六、 RPM安裝puppet

RPM方式安裝puppet比較簡單,我們只需yum安裝即可。如下:

6.1 puppet安裝準備工作

在使用RPM安裝之前,我們要先配置額外的yum源,否則系統會提示找不到puppet軟件包。如下:

yum -y install puppet-server

clip_p_w_picpath042

安裝額外的yum源,我們可以在puppet的官網查找到yum源。如下:

https://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#for-red-hat-enterprise-linux-and-derivatives

clip_p_w_picpath022[1]

按照puppet官網的方法進行安裝。如下:

rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

clip_p_w_picpath023[1]

注意:該yum源無論是master端和agent端都需要進行配置。

6.2 master端安裝與配置

現在開始yum安裝master端,如下:

yum -y install puppet-server

clip_p_w_picpath043

clip_p_w_picpath044

通過上圖,我們可以看到安裝puppet-server是要依賴於facter、hiera和puppet三個軟件包。

現在我們來查看puppet-server安裝時新建的用戶以及puppet服務運行時所用的用戶,如下:

cat /etc/passwd

ps aux |grep puppet

clip_p_w_picpath045

clip_p_w_picpath046

通過上圖,我們可以看到puppet-server在安裝時確實新建用戶puppet,以及在運行時使用的確實puppet用戶。

查看puppet服務所使用的端口,如下:

/etc/init.d/puppetmaster start

netstat -tunlp

clip_p_w_picpath047

master端安裝完畢後,我們來配置puppet服務的配置文件,其方法和源碼安裝方法一樣。如下:

vi /etc/puppet/puppet.conf

server = s.ilanni.com

certname = s.ilanni.com

pluginsync = false

clip_p_w_picpath048

6.3 agent端安裝與配置

master端安裝完畢後,我們來安裝agent端如下:

yum -y install puppet

clip_p_w_picpath049

clip_p_w_picpath050

RPM安裝的puppet客戶端與源碼安裝的一樣,我們現在來啓動puppet客戶端。如下:

clip_p_w_picpath051

clip_p_w_picpath052

通過上圖,我們可以看出agent端安裝時也創建了puppet用戶,但是puppet運行時沒有使用該用戶而是使用root用戶。這個與源碼安裝的相對應。

agent端安裝完畢後,我們來配置agent端的配置文件,其方法和源碼安裝方法一樣。如下:

vi /etc/puppet/puppet.conf

server = s.ilanni.com

pluginsync = false

clip_p_w_picpath053

七、 puppet證書授權

我們知道puppet爲了安全,採用ssl隧道通信,因此需要申請證書來驗證。

7.1 master端證書初始化

當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

clip_p_w_picpath054

從日誌中我們可以看出第一次啓動master端時,puppet服務會在本地創建認證中心,給自己授權證書和key,這個我們可以在/var/lib/puppet/ssl看到那些證書和key。如下:

ll /var/lib/puppet/ssl

clip_p_w_picpath055

這個目錄和/etc/puppet/puppet.conf文件中配置的ssldir路徑有關係。

我們也可以查看master端給自己授權的證書文件,如下:

ll /var/lib/puppet/ssl/ca/signed

clip_p_w_picpath056

7.2 agent端申請證書

agent端在第一次連接master端時,會向master端申請證書。如果master端沒有授予agent端證書,那麼agent端和master端之間的連接是不會建立成功的。

此時agent端會持續等待master端授權證書,並會每隔2分鐘去檢查master端是否簽發證書。

我們現在使用puppet agent --server s.ilanni.com連接master端,如下:

puppet agent --server s.ilanni.com

clip_p_w_picpath057

7.3 master端授權證書

agent端申請證書完畢後,需要我們切換到master端,使用puppet cert命令來對agent端授權證書。

有關puppet cert的使用,我們可以查看pupper cert的幫助信息。如下:

pupper cert

clip_p_w_picpath058

在上圖中,puppet cert已經給出如何給一個agent端進行授權證書的例子。

現在我們來查看master端有哪些主機在申請證書,如下:

puppet cert list

clip_p_w_picpath059

通過上圖,我們很明顯的可以看到c.ilanni.com客戶端正在申請證書。

現在我們來給agent端授權證書,使用如下命令:

puppet cert sign c.ilanni.com

clip_p_w_picpath060

注意:如果實際生產環境客戶端數量比較多的話,我們可以一次性授權所有證書。如下:

puppet cert sign --all

clip_p_w_picpath061

在master端查看所有已經通過認證的agent端,如下:

puppet cert -all

clip_p_w_picpath062

現在我們再來看看master端給agent端授權的證書文件,如下:

ll /var/lib/puppet/ssl/ca/signed

clip_p_w_picpath063

通過上圖,我們可以看出master端授權客戶端c.ilanni.com的證書文件是c.ilanni.com.pem。

7.4 查看agent端證書

在master端授權完畢後,我們現在切換到agent端查看授權的證書文件,如下:

ll /var/lib/puppet/ssl/certs

clip_p_w_picpath064

通過上圖,我們可以看出agent端的證書文件c.ilanni.com.pem與master端的證書文件是一樣的。

7.5 puppet證書問題

在實際的生產環境中,可能會出現已經通過master端認證的agent端主機名被修改或者其他一些誤操作,從而導致agent端無法與master端進行正常通信。

當遇到這種情況時,我們一般的處理方法是先刪除master端和agent端的相關的認證文件,然後在agent端重新申請證書。

具體操作如下:

agent端,刪除/var/lib/puppet/ssl目錄,如下:

rm -fr /var/lib/puppet/ssl

clip_p_w_picpath065

master端,刪除/var/lib/puppet/ssl/ca/signed目錄下的證書文件,如下:

rm -fr /var/lib/puppet/ssl/ca/signed/c.ilanni.com.pem

clip_p_w_picpath066

以上操作完畢後,agent端再次申請證書即可。

八、 puppet資源

puppet環境搭建完畢後,我們現在開始來介紹puppet資源相關的內容。

8.1 puppet的資源類型及幫助

puppet的資源,我們是可以通過相關命令查看puppet支持的資源類型。

通過前面的章節,我們知道puppet是支持子命令進行查詢的。如下:

puppet help ca

clip_p_w_picpath067

查看puppet支持的資源類型。如下:

puppet describe --list

clip_p_w_picpath068

也可以通過puppet resource --type命令查詢,如下:

puppet resource --type

clip_p_w_picpath069

通過上圖,我們可以看到puppet支持用戶user、文件file、crontab等大部分的資源。

如果想查看user的資源,我們還是繼續使用puppet describe user命令進行查看。如下:

puppet describe user

clip_p_w_picpath070

如果我們想查看user在puppet站點site.pp文件中的具體使用方法,可以通過如下命令進行查看:

puppet resource user

clip_p_w_picpath071

通過上圖,我們可以看到puppet已經給出了user使用的例子,我們只需要按照這個例子進行操作即可。

注意:如果puppet describe幫助中沒有該資源在site.pp站點中的使用詳情,我們可以去到puppet resource中進行查看。

clip_p_w_picpath072

clip_p_w_picpath073

這個只是以user資源爲例,如果想查看host資源的幫助,我們也可以使用類似的命令,如下:

puppet resource host

clip_p_w_picpath074

如果你不想在本機進行查看,那麼也可以去puppet官網進行查看,如下:

https://docs.puppetlabs.com/references/latest/type.html

clip_p_w_picpath075

clip_p_w_picpath076

8.2 puppet資源配置文件

puppet的資源配置文件在服務端的/etc/puppet/manifests目錄下,我們需要在該目錄下創建一個站點文件site.pp。

我們在該文件中創建需要同步到agent端的資源,如下:

cat /etc/puppet/manifests/site.pp

clip_p_w_picpath077

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的話,查看該文件內容時會顯示成這樣:

clip_p_w_picpath078

同時site.pp文件創建完畢後,我們要先重啓下master端,如下:

/etc/init.d/puppetmaster restart

clip_p_w_picpath079

現在切換到agent端同步該資源,如下:

puppet agent --test --server s.ilanni.com

clip_p_w_picpath080

通過上圖,我們可以看到agent端已經把master端的資源的同步到本地。

現在我們來查看,agent端的/tmp目錄下是否有test.txt這個文件。如下:

cat /tmp/test.txt

clip_p_w_picpath081

通過上圖,我們可以看到agent端確實已經同步到master端的資源。/tmp目錄下確實有test.txt這個文件,而且內容也確實和master端的一樣。

到此有關puppet3.7搭建與配置介紹完畢,下一篇文章我們會介紹在生產環境中,puppet同步的資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章