puppet安裝和部署html
puppet是一種基於ruby語言開發的Lnux、Unix、windows平臺的集中配置管理系統。它使用自有的puppet描述語言,可管理配置文件file、用戶user、cron任務、軟件包、系統服務等系統實體。node
puppet把這些系統實體稱之爲資源,puppet設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。linux
puppet依賴於C/S(客戶端/服務器)的部署架構。它須要在puppet服務器上安裝puppet-server軟件包(如下簡稱master),在須要管理的目標主機上安裝puppet客戶端軟件(如下簡稱agent)。shell
當agent鏈接上master後,定義在master端的配置文件會被編譯,而後在agent上運行。每一個agent默認30分鐘會鏈接一次master,確認配置信息的更新狀況。可是這種方式在不少場景下不是很符合系統管理員的要求,因此不少系統管理員也會將agent經過crontab(任務計劃)來管理,這樣會更加靈活一些。vim
puppet的語法容許你建立一個單獨的腳本,用來在你全部的目標主機上創建一個用戶。全部的目標主機會依次使用適合本地系統的語法來解釋和執行這個模塊。若是這個配置是在Red Hat服務器上執行的話,創建用戶使用useradd命令,若是這個配置是在FreddBSD服務器上執行的話,則使用adduser命令。windows
puppet另一個卓越的地方就是它的靈活性。源於開源軟件的天性,你能夠自由地得到puppet的源代碼。若是你遇到問題而且有能力處理的話,你能夠修改或增強puppet的代碼使其適用於你的環境,而後解決這個問題。centos
puppet也是易於擴展的。定製軟件包的支持功能和特殊的系統環境配置可以快速簡單地添加至puppet的安裝程序中。安全
本次實驗OS爲centos 6,服務端爲:192.168.180.97,客戶端爲192.168.180.98ruby
爲了減小在實驗過程當中沒必要要的麻煩,咱們須要對全部主機(包括服務器和客戶端)進行時間同步。即服務器與客戶端的時間相差不能超過秒級。bash
使用如下命令進行時間同步,以下:
ntpdate 192.168.186.1 #或者用chron* yum install chron* #修改服務器爲192.168.186.1,allow全部:0.0.0.0/0 vim /etc/chron* /etc/init.d/chron* start chkconfig chron* on
由於安裝 puppet 時會把主機名寫入證書,同時客戶端和服務端之間通訊須要這個證書。若是主機沒有設置主機名,則須要修改服務器與客戶端的主機名。
修改主機名。以下:
vim /etc/sysconfig/network hostname p-server\p-client vim /etc/hosts 192.168.180.97 p-server 192.168.180.98 p-client reboot
咱們如今全部的實驗都是在關閉iptables和selinux下進行的。
/etc/init.d/iptables stop chkconfig iptables off sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0
puppet的安裝能夠分爲源碼安裝和RPM安裝,可是不管哪種安裝方法,咱們都須要在安裝以前對其進行幾點須要說明。
因爲puppet是採用ruby語言開發,因此不管是源碼仍是RPM方式安裝puppet,咱們都必需要先安裝ruby語言環境
puppet從2.7版本之後,就須要hiera的支持。因此也必須安裝hiera。
在前面章節中,咱們說明了puppet是一個配置管理系統,而管理的資源,都是系統的實體。可是這些實體,是如何來的呢?這就須要咱們安裝另一個資源收集軟件—facter。
facter主要用來收集主機的一些信息,好比:CPU、主機IP等。facter把這些收集的信息發送給puppet服務器端,服務器端就能夠根據不一樣的條件來對不一樣的節點機器生成不一樣的puppet配置文件。
ruby的安裝比較簡單,咱們在此使用是yum進行安裝。以下:
yum -y install ruby ruby-rdoc #咱們能夠查看ruby的幫助信息,以下: ruby -h
facter咱們能夠從puppet官網下載,以下:
http://downloads.puppetlabs.com/facter/
注意:facter也能夠經過yum進行安裝,在此咱們使用的是源碼安裝。
下載facter 2.4.6(3.x的版本應該是其餘軟件了無法用),以下:
wget http://downloads.puppetlabs.com/facter/facter-2.4.6.tar.gz tar -zxvf facter-2.4.6.tar.gz ruby install.rb或者./install.rb #facter安裝完畢後,咱們來查看下facter的使用幫助。以下: facter -h
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。
puppet服務端與客戶端的源碼安裝使用的是同一個軟件包,安裝步驟同樣,只是在配置文件方面有細微的差異。
在下載puppet源碼以前,咱們還要在master端和agent端建立puppet運行時使用的用戶puppet。
建立puppet用戶,以下:
useradd -M -s /sbin/nologin puppet
注意:puppet服務端是以puppet用戶運行的,而puppet客戶端是root用戶運行。
這樣作的目的是:master在服務端以普通用戶運行安全性比較高,而agent在客戶端以root用戶運行,是由於master在建立用戶、修改系統文件等資源時,須要具備最高權限。
puppet的源碼包,咱們能夠從puppet官網下載。目前puppet最新版爲3.8.7(4.x版本太新,雖說性能提高3-4被,但網上截止發帖日都沒有太多參考教程暫不研究),以下:
http://downloads.puppetlabs.com/puppet/
下載puppet軟件包。以下:
wget http://downloads.puppetlabs.com/puppet/puppet-3.8.7.tar.gz tar -zxvf puppet-3.8.7.tar.gz ruby install.rb或者./install.rb
查看puppet的安裝位置:/etc/puppet/
puppet安裝完畢後,咱們來配置下server端:
cp ext/redhat/puppet.conf /etc/puppet/ vim /etc/puppet/puppet.conf server = p-server certname = p-server pluginsync = false
其中:
p-server表示puppet服務器的主機名。
pluginsync = false表示關閉模塊中的插件功能
配置文件修改完畢後,咱們如今來配置server端的啓動腳本,以下:
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" tcp 0 0 0.0.0.0:8140 0.0.0.0:* LISTEN 26486/ruby #把puppetmaster加入到開機啓動項。 chkconfig --add puppetmaster chkconfig puppetmaster on
agent端的配置,以下:。
cp ext/redhat/puppet.conf /etc/puppet/ cat /etc/puppet/puppet.conf server = p-server pluginsync = false
其中:
p-server表示puppet服務器的主機名。
pluginsync = false表示關閉模塊中的插件功能
agent端啓動,咱們能夠經過puppet agent命令來啓動。以下:
puppet agent ps aux |grep puppet root 23854 0.0 1.5 162220 61932 ? Ss 11:49 0:06 /usr/bin/ruby /usr/bin/puppet agent
經過上圖,咱們也能夠看出agent端運行時使用的用戶爲root,而不是puppet用戶。
注意:agent端咱們使用puppet agent命令來進行各類管理,包括證書的申請、資源的同步,咱們都是經過這個命令進行的。
agent能夠以兩種方式運行:第一種方式是命令接參數鏈接server,第二種是以守護進程的形式在系統後臺運行,默認每30分鐘鏈接一次server,可是這樣並不靈活。咱們通常是使用第一種方式,並配合crontab使用。
咱們知道puppet爲了安全,採用ssl隧道通訊,所以須要申請證書來驗證。
當server端第一次啓動的時候,能夠查看/var/log/message日誌文件中,有相似以下的信息:
tail -f /var/log/messages Jun 11 11:15:25 jijilu-test puppet-master[26440]: Signed certificate request for ca Jun 11 11:15:25 jijilu-test puppet-master[26440]: jijilu-test has a waiting certificate request Jun 11 11:15:25 jijilu-test puppet-master[26440]: Signed certificate request for jijilu-test Jun 11 11:15:25 jijilu-test puppet-master[26440]: Removing file Puppet::SSL::CertificateRequest jijilu-test at '/var/lib/puppet/ssl/ca/requests/jijilu-test.pem' Jun 11 11:15:25 jijilu-test puppet-master[26440]: Removing file Puppet::SSL::CertificateRequest jijilu-test at '/var/lib/puppet/ssl/certificate_requests/jijilu-test.pem' Jun 11 11:15:26 jijilu-test puppet-master[26486]: Reopening log files Jun 11 11:15:26 jijilu-test puppet-master[26486]: Starting Puppet master version 3.8.1 Jun 11 11:49:17 jijilu-test puppet-master[26486]: 430-test01 has a waiting certificate request
從日誌中咱們能夠看出第一次啓動server端時,puppet服務會在本地建立認證中心,給本身受權證書和key,這個咱們能夠在/var/lib/puppet/ssl看到那些證書和key。以下:
ll /var/lib/puppet/ssl drwxr-xr-x 5 puppet puppet 4096 Jun 11 11:15 ca drwxr-xr-x 2 puppet puppet 4096 Jun 11 11:15 certificate_requests drwxr-xr-x 2 puppet puppet 4096 Jun 11 11:15 certs -rw-r--r-- 1 puppet puppet 958 Jun 11 11:15 crl.pem drwxr-x--- 2 puppet puppet 4096 Jun 11 11:05 private drwxr-x--- 2 puppet puppet 4096 Jun 11 11:06 private_keys drwxr-xr-x 2 puppet puppet 4096 Jun 11 11:06 public_keys
這個目錄和/etc/puppet/puppet.conf文件中配置的ssldir路徑有關係。
咱們也能夠查看master端給本身受權的證書文件,以下:
ll /var/lib/puppet/ssl/ca/signed -rw-r--r-- 1 puppet puppet 1944 Jun 11 11:15 p-server.pem
agent端在第一次鏈接master端時,會向server端申請證書。若是server端沒有授予agent端證書,那麼agent端和server端之間的鏈接是不會創建成功的。
此時agent端會持續等待server端受權證書,並會每隔2分鐘去檢查server端是否簽發證書。
咱們如今使用puppet agent --server p-server鏈接master端,以下:
puppet agent --server p-server
agent端申請證書完畢後,須要咱們切換到server端,使用puppet cert命令來對agent端受權證書。
有關puppet cert的使用,咱們能夠查看pupper cert的幫助信息。以下:
pupper cert
如今咱們能夠查看master端有哪些主機在申請證書,以下:
puppet cert list
如今咱們來給agent端受權證書,使用以下命令:
puppet cert sign p-client
注意:
若是實際生產環境客戶端數量比較多的話,咱們能夠一次性受權全部證書。以下:
puppet cert sign --all
在master端查看全部已經經過認證的agent端,以下:
puppet cert -all
# 如今咱們再來看看master端給agent端受權的證書文件,以下:
ll /var/lib/puppet/ssl/ca/signed
-rw-r--r-- 1 puppet puppet 1939 Jun 11 11:55 p-client.pem
-rw-r--r-- 1 puppet puppet 1944 Jun 11 11:15 p-server.pem
經過上圖,咱們能夠看出server端受權客戶端c.ilanni.com的證書文件是p-client.pem。
在server端受權完畢後,咱們如今切換到agent端查看受權的證書文件,以下:
ll /var/lib/puppet/ssl/certs
-rw-r--r--. 1 puppet puppet 1939 Jun 11 11:57 p-client.pem
-rw-r--r--. 1 puppet puppet 1944 Jun 11 11:49 ca.pem
經過上圖,咱們能夠看出agent端的證書文件p-client.pem與server端的證書文件是同樣的。
在實際的生產環境中,可能會出現已經經過server端認證的agent端主機名被修改或者其餘一些誤操做,從而致使agent端沒法與server端進行正常通訊。
當遇到這種狀況時,咱們通常的處理方法是先刪除server端和agent端的相關的認證文件,而後在agent端從新申請證書。
具體操做以下:
agent端,刪除/var/lib/puppet/ssl目錄,以下:
rm -fr /var/lib/puppet/ssl
server端,刪除/var/lib/puppet/ssl/ca/signed目錄下的證書文件,以下:
rm -fr /var/lib/puppet/ssl/ca/signed/c.ilanni.com.pem
以上操做完畢後,agent端再次申請證書便可。
puppet環境搭建完畢後,咱們如今開始來介紹puppet資源相關的內容。
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官網進行查看,以下:
https://docs.puppetlabs.com/references/latest/type.html
puppet的資源配置文件在服務端的/etc/puppet/manifests目錄下,咱們須要在該目錄下建立一個站點文件site.pp。
咱們在該文件中建立須要同步到agent端的資源,以下:
# cat /etc/puppet/manifests/site.pp
node default{
file { "/tmp/test.txt":
content => "Hello,calvin ,this is puppet test!n"}
}
以上命令表示在puppet資源配置文件衝建立一個默認節點,使用file資源,在agent端的/tmp/目錄下建立test.txt,內容爲:Hello, calvin,this is puppet test!n
注意:
其中的n表示換行。若是不加n的話,查看該文件內容時會顯示成這樣:
Hello,calvin,this is puppet test![root@430-test01 ~]#
同時site.pp文件建立完畢後,咱們要先重啓下server端,以下:
/etc/init.d/puppetmaster restart
如今切換到agent端同步該資源,以下:
puppet agent --test --server p-server
經過上圖,咱們能夠看到agent端已經把server端的資源的同步到本地。
如今咱們來查看,agent端的/tmp目錄下是否有test.txt這個文件。以下:
cat /tmp/test.txt
經過上圖,咱們能夠看到agent端確實已經同步到server端的資源。/tmp目錄下確實有test.txt這個文件,並且內容也確實和server端的同樣。
到此有關puppet3.8搭建與配置介紹完畢。
描述:經過puppet服務端能夠向被管理機(客戶端)上推送文件,方法是使用file類型的source屬性
第一步:
# vi /etc/puppet/fileserver.conf
[files]
path /opt/
allow *
# 設置文件推送到目錄
# 設置准許鏈接到服務端的主機地址
第二步:vi /etc/puppet/manifests/site.pp
File
{ "/opt/rlwrap-0.30.tar.gz":
source=> "puppet://$puppetserver/files/rlwrap-0.30.tar.gz",
}
# 設置服務器上/opt目錄下的rlwrap-0.30.tar.gz爲被傳送文件
#此處「$puppetserver」是Puppet Server端的名稱,即hostname,在hosts文件裏指定,生產環境下用內部的DNS上做解析
第三步:
在客戶端執行更新命令
# puppet agent --test --server jijilu-test
Info: Caching catalog for 430-test01
Info: Applying configuration version '1434090440'
Notice: /Stage[main]/Main/File[/opt/rlwrap-0.30.tar.gz]/ensure: defined content as '{md5}03d8bd4996945ea32d3c7d5dc38c956e'
Notice: Finished catalog run in 0.44 seconds
查看/opt目錄下已經同步這個文件:
# ll /opt/
total 184
drwxr-xr-x. 2 root root 4096 Jun 22 2012 rh
-rw-r--r--. 1 root root 184037 Jun 12 15:41 rlwrap-0.30.tar.gz
描述:把/tmp/test.txt文件的權限改成puppet用戶,並設置權限爲666。
第一步:編輯服務端的site.pp
vi /etc/puppet/manifests/site.pp
file
{ "/tmp//tmp/test.txt ": owner => "puppet",
group => "puppet", mode => 666,
}
第二步:在客戶端執行命令
# puppet agent --test --server jijilu-test
Info: Caching catalog for 430-test01
Info: Applying configuration version '1434095252'
Notice: /Stage[main]/Main/File[/tmp/test.txt]/owner: owner changed 'root' to 'puppet'
Notice: /Stage[main]/Main/File[/tmp/test.txt]/group: group changed 'root' to 'puppet'
Notice: /Stage[main]/Main/File[/tmp/test.txt]/mode: mode changed '0644' to '0666'
Notice: Finished catalog run in 0.03 seconds
描述:經過puppet分發執行shell腳本,在客戶端的opt目錄下新建一目錄shelldir。
第一步:編輯服務端的site.pp
vi /etc/puppet/manifests/site.pp
exec { "exec-mkdir": cwd => "/opt",
command => "sh /opt/lgh.sh",
user => "root",
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
}
第二步:在客戶端編輯上一步command路徑中指定的shell腳本,例如
vi /opt/lgh.sh
#!/bin/bash
mkdir /opt/shelldir
第三步:在客戶端執行命令
# puppet agent --test --server jijilu-test
Info: Caching catalog for 430-test01
Info: Applying configuration version '1434095394'
Notice: /Stage[main]/Main/Exec[exec-mkdir]/returns: executed successfully
Notice: Finished catalog run in 0.21 seconds
在/opt目錄下查看shelldir目錄有沒有創建。
描述:接上面的shell程序實例,在17:30執行/opt/lgh.sh。
第一步:編輯服務端的site.pp
vi /etc/puppet/manifests/site.pp
cron { "cron-shell":
command => "sh /opt/lgh.sh",
user => "root",
minute => "30",
hour => "17"
}
第二步:在客戶端執行命令
# puppet agent --test --server jijilu-test
Info: Caching catalog for 430-test01
Info: Applying configuration version '1434095710'
Notice: /Stage[main]/Main/Cron[cron-shell]/ensure: created
Notice: Finished catalog run in 0.12 seconds
而後在客戶端使用
# crontab -l查看效果
# crontab -l
# HEADER: This file was autogenerated at Fri Jun 12 15:55:11 +0800 2015 by puppet.
# HEADER: While it can still be managed manually, it is definitely not recommended.
# HEADER: Note particularly that the comments starting with 'Puppet Name' should
# HEADER: not be deleted, as doing so could cause duplicate cron jobs.
* * * * * /usr/sbin/ntpdate 10.10.1.230 >/dev/null 2>&1
# Puppet Name: cron-shell
30 17 * * * sh /opt/lgh.sh
描述:能夠經過puppet對一些服務進行檢查。puppet是經過service命令操做的。因此,只能針對在/etc/init.d/目錄下的服務
實例:把客戶端的防火牆起來
第一步:編輯服務端的site.pp
vi /etc/puppet/manifests/site.pp
service
{ iptables:
ensure => "running",
}
第二步:在客戶端執行命令
# puppet agent --test --server jijilu-test
Info: Caching catalog for 430-test01
Info: Applying configuration version '1434095840'
Notice: /Stage[main]/Main/Service[iptables]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Main/Service[iptables]: Unscheduling refresh on Service[iptables]
Notice: Finished catalog run in 0.20 seconds
# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination