如何在 Ubuntu 15.04 中安裝 puppet
![](https://linuxstory.org/wp-content/uploads/2024/06/093245eiiz284dw4gw28i1-800x400.jpg)
1.設置主機文件
在本教程里,我們將使用2台運行 ubuntu 15.04 「Vivid Vervet" 的主機,一台作為主控伺服器,另一台作為 puppet 的代理節點。下面是我們將用到的伺服器的基礎信息。
- puupet 主控伺服器 IP:44.55.88.6 ,主機名: puppetmaster
- puppet 代理節點 IP: 45.55.86.39 ,主機名: puppetnode
我們要在代理節點和伺服器這兩台機器的 hosts 文件裡面都添加上相應的條目,使用 root 或是 sudo 訪問許可權來編輯 /etc/hosts
文件,命令如下:
# nano /etc/hosts
45.55.88.6 puppetmaster.example.com puppetmaster
45.55.86.39 puppetnode.example.com puppetnode
注意,puppet 主控伺服器必使用 8140 埠來運行,所以請務必保證開啟8140埠。
2. 用 NTP 更新時間
puppet 代理節點所使用系統時間必須要準確,這樣可以避免代理證書出現問題。如果有時間差異,那麼證書將過期失效,所以伺服器與代理節點的系統時間必須互相同步。我們使用 NTP( Network Time Protocol )來同步時間。在伺服器與代理節點上面分別運行以下命令來同步時間。
# ntpdate pool.ntp.org
17 Jun 00:17:08 ntpdate[882]: adjust time server 66.175.209.17 offset -0.001938 sec
(LCTT 譯註:顯示類似的輸出結果表示運行正常)
如果沒有安裝 ntp,請使用下面的命令更新你的軟體倉庫,安裝並運行ntp服務
# apt-get update && sudo apt-get -y install ntp ; service ntp restart
3. 安裝主控伺服器軟體
安裝開源版本的 puppet 有很多的方法。在本教程中我們在 puppet 實驗室官網下載一個名為 puppetlabs-release 的軟體包的軟體源,安裝後它將為我們在軟體源裡面添加 puppetmaster-passenger。puppetmaster-passenger 包括帶有 apache 的 puppet 主控伺服器。我們開始下載這個軟體包:
# cd /tmp/
# wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
--2015-06-17 00:19:26-- https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
Resolving apt.puppetlabs.com (apt.puppetlabs.com)... 192.155.89.90, 2600:3c03::f03c:91ff:fedb:6b1d
Connecting to apt.puppetlabs.com (apt.puppetlabs.com)|192.155.89.90|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7384 (7.2K) [application/x-debian-package]
Saving to: 『puppetlabs-release-trusty.deb』
puppetlabs-release-tr 100%[===========================>] 7.21K --.-KB/s in 0.06s
2015-06-17 00:19:26 (130 KB/s) - 『puppetlabs-release-trusty.deb』 saved [7384/7384]
下載完成,我們來安裝它:
# dpkg -i puppetlabs-release-trusty.deb
Selecting previously unselected package puppetlabs-release.
(Reading database ... 85899 files and directories currently installed.)
Preparing to unpack puppetlabs-release-trusty.deb ...
Unpacking puppetlabs-release (1.0-11) ...
Setting up puppetlabs-release (1.0-11) ...
使用 apt 包管理命令更新一下本地的軟體源:
# apt-get update
現在我們就可以安裝 puppetmaster-passenger 了
# apt-get install puppetmaster-passenger
提示: 在安裝的時候可能會報錯:
Warning: Setting templatedir is deprecated.see http://links.puppetlabs.com/env-settings-deprecations (at /usr/lib/ruby/vendor_ruby/puppet/settings.rb:1139:in `issue_deprecation_warning')
不過不用擔心,忽略掉它就好,我們只需要在設置配置文件的時候把這一項禁用就行了。
如何來查看 puppet 主控伺服器是否已經安裝成功了呢?非常簡單,只需要使用下面的命令查看它的版本就可以了。
# puppet --version
3.8.1
現在我們已經安裝好了 puppet 主控伺服器。因為我們使用的是配合 apache 的 passenger,由 apache 來控制 puppet 主控伺服器,當 apache 運行時 puppet 主控伺服器才運行。
在開始之前,我們需要通過停止 apache 服務來讓 puppet 主控伺服器停止運行。
# systemctl stop apache2
4. 使用 Apt 工具鎖定主控伺服器的版本
現在已經安裝了 3.8.1 版的 puppet,我們鎖定這個版本不讓它隨意升級,因為升級會造成配置文件混亂。 使用 apt 工具來鎖定它,這裡我們需要使用文本編輯器來創建一個新的文件 /etc/apt/preferences.d/00-puppet.pref
:
# nano /etc/apt/preferences.d/00-puppet.pref
在新創建的文件裡面添加以下內容:
# /etc/apt/preferences.d/00-puppet.pref
Package: puppet puppet-common puppetmaster-passenger
Pin: version 3.8*
Pin-Priority: 501
這樣在以後的系統軟體升級中, puppet 主控伺服器將不會跟隨系統軟體一起升級。
5. 配置 Puppet 主控伺服器
Puppet 主控伺服器作為一個證書發行機構,需要生成它自己的證書,用於簽署所有代理的證書的請求。首先我們要刪除所有在該軟體包安裝過程中創建出來的 ssl 證書。本地默認的 puppet 證書放在 /var/lib/puppet/ssl
。因此我們只需要使用 rm
命令來整個移除這些證書就可以了。
# rm -rf /var/lib/puppet/ssl
現在來配置該證書,在創建 puppet 主控伺服器證書時,我們需要包括代理節點與主控伺服器溝通所用的每個 DNS 名稱。使用文本編輯器來修改伺服器的配置文件 puppet.conf
:
# nano /etc/puppet/puppet.conf
輸出的結果像下面這樣
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
在這我們需要注釋掉 templatedir
這行使它失效。然後在文件的 [main]
小節的結尾添加下面的信息。
server = puppetmaster
environment = production
runinterval = 1h
strict_variables = true
certname = puppetmaster
dns_alt_names = puppetmaster, puppetmaster.example.com
還有很多你可能用的到的配置選項。 如果你有需要,在 Puppet 實驗室有一份詳細的描述文件供你閱讀: Main Config File (puppet.conf)。
編輯完成後保存退出。
使用下面的命令來生成一個新的證書。
# puppet master --verbose --no-daemonize
Info: Creating a new SSL key for ca
Info: Creating a new SSL certificate request for ca
Info: Certificate Request fingerprint (SHA256): F6:2F:69:89:BA:A5:5E:FF:7F:94:15:6B:A7:C4:20:CE:23:C7:E3:C9:63:53:E0:F2:76:D7:2E:E0:BF:BD:A6:78
...
Notice: puppetmaster has a waiting certificate request
Notice: Signed certificate request for puppetmaster
Notice: Removing file Puppet::SSL::CertificateRequest puppetmaster at '/var/lib/puppet/ssl/ca/requests/puppetmaster.pem'
Notice: Removing file Puppet::SSL::CertificateRequest puppetmaster at '/var/lib/puppet/ssl/certificate_requests/puppetmaster.pem'
Notice: Starting Puppet master version 3.8.1
^CNotice: Caught INT; storing stop
Notice: Processing stop
至此,證書已經生成。一旦我們看到 Notice: Starting Puppet master version 3.8.1
,就表明證書就已經製作好了。我們按下 CTRL-C
回到 shell 命令行。
查看新生成證書的信息,可以使用下面的命令。
# puppet cert list -all
+ "puppetmaster" (SHA256) 33:28:97:86:A1:C3:2F:73:10:D1:FB:42:DA:D5:42:69:71:84:F0:E2:8A:01:B9:58:38:90:E4:7D:B7:25:23:EC (alt names: "DNS:puppetmaster", "DNS:puppetmaster.example.com")
6. 創建一個 Puppet 清單
默認的主 清單 是 /etc/puppet/manifests/site.pp
。 這個主要清單文件包括了用於在代理節點執行的配置定義。現在我們來創建一個清單文件:
# nano /etc/puppet/manifests/site.pp
在剛打開的文件裡面添加下面這幾行:
# execute 'apt-get update'
exec { 'apt-update': # exec resource named 'apt-update'
command => '/usr/bin/apt-get update' # command this resource will run
}
# install apache2 package
package { 'apache2':
require => Exec['apt-update'], # require 'apt-update' before installing
ensure => installed,
}
# ensure apache2 service is running
service { 'apache2':
ensure => running,
}
以上這幾行的意思是給代理節點部署 apache web 服務。
7. 運行 puppet 主控服務
已經準備好運行 puppet 主控伺服器 了,那麼開啟 apache 服務來讓它啟動
# systemctl start apache2
我們 puppet 主控伺服器已經運行,不過它還不能管理任何代理節點。現在我們給 puppet 主控伺服器添加代理節點.
提示: 如果報錯
Job for apache2.service failed. see "systemctl status apache2.service" and "journalctl -xe" for details.
肯定是 apache 伺服器有一些問題,我們可以使用 root 或是 sudo 訪問許可權來運行 apachectl start
查看它輸出的日誌。在本教程執行過程中, 我們發現一個 /etc/apache2/sites-enabled/puppetmaster.conf
的證書配置問題。修改其中的 SSLCertificateFile /var/lib/puppet/ssl/certs/server.pem
為 SSLCertificateFile /var/lib/puppet/ssl/certs/puppetmaster.pem
,然後注釋掉後面這行 SSLCertificateKeyFile
。然後在命令行重新啟動 apache。
8. 安裝 Puppet 代理節點的軟體包
我們已經準備好了 puppet 的伺服器,現在需要一個可以管理的代理節點,我們將安裝 puppet 代理軟體到節點上去。這裡我們要給每一個需要管理的節點安裝代理軟體,並且確保這些節點能夠通過 DNS 查詢到伺服器主機。下面將 安裝最新的代理軟體到 節點 puppetnode.example.com 上。
在代理節點上使用下面的命令下載 puppet 實驗室提供的軟體包:
# cd /tmp/
# wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
--2015-06-17 00:54:42-- https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
Resolving apt.puppetlabs.com (apt.puppetlabs.com)... 192.155.89.90, 2600:3c03::f03c:91ff:fedb:6b1d
Connecting to apt.puppetlabs.com (apt.puppetlabs.com)|192.155.89.90|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7384 (7.2K) [application/x-debian-package]
Saving to: 『puppetlabs-release-trusty.deb』
puppetlabs-release-tr 100%[===========================>] 7.21K --.-KB/s in 0.04s
2015-06-17 00:54:42 (162 KB/s) - 『puppetlabs-release-trusty.deb』 saved [7384/7384]
在 ubuntu 15.04 上我們使用 debian 包管理系統來安裝它,命令如下:
# dpkg -i puppetlabs-release-trusty.deb
使用 apt 包管理命令更新一下本地的軟體源:
# apt-get update
通過遠程倉庫安裝:
# apt-get install puppet
Puppet 代理默認是不啟動的。這裡我們需要使用文本編輯器修改 /etc/default/puppet
文件,使它正常工作:
# nano /etc/default/puppet
更改 START
的值改成 "yes
" 。
START=yes
最後保存並退出。
9. 使用 Apt 工具鎖定代理軟體的版本
和上面的步驟一樣為防止隨意升級造成的配置文件混亂,我們要使用 apt 工具來把它鎖定。具體做法是使用文本編輯器創建一個文件 /etc/apt/preferences.d/00-puppet.pref
:
# nano /etc/apt/preferences.d/00-puppet.pref
在新建的文件裡面加入如下內容
# /etc/apt/preferences.d/00-puppet.pref
Package: puppet puppet-common
Pin: version 3.8*
Pin-Priority: 501
這樣 puppet 就不會隨著系統軟體升級而隨意升級了。
10. 配置 puppet 代理節點
我們需要編輯一下代理節點的 puppet.conf
文件,來使它運行。
# nano /etc/puppet/puppet.conf
它看起來和伺服器的配置文件完全一樣。同樣注釋掉 templatedir
這行。不同的是在這裡我們需要刪除掉所有關於[master]
的部分。
假定主控伺服器可以通過名字「puppet-master」訪問,我們的客戶端應該可以和它相互連接通信。如果不行的話,我們需要使用完整的主機域名 puppetmaster.example.com
[agent]
server = puppetmaster.example.com
certname = puppetnode.example.com
在文件的結尾增加上面3行,增加之後文件內容像下面這樣:
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
#templatedir=$confdir/templates
[agent]
server = puppetmaster.example.com
certname = puppetnode.example.com
最後保存並退出。
使用下面的命令來啟動客戶端軟體:
# systemctl start puppet
如果一切順利的話,我們不會看到命令行有任何輸出。 第一次運行的時候,代理節點會生成一個 ssl 證書並且給伺服器發送一個請求,經過簽名確認後,兩台機器就可以互相通信了。
提示: 如果這是你添加的第一個代理節點,建議你在添加其他節點前先給這個證書籤名。一旦能夠通過並正常運行,回過頭來再添加其他代理節點。
11. 在主控伺服器上對證書請求進行簽名
第一次運行的時候,代理節點會生成一個 ssl 證書並且給伺服器發送一個簽名請求。在主控伺服器給代理節點伺服器證書籤名之後,主伺服器才能和代理伺服器通信並且控制代理伺服器。
在主控伺服器上使用下面的命令來列出當前的證書請求:
# puppet cert list
"puppetnode.example.com" (SHA256) 31:A1:7E:23:6B:CD:7B:7D:83:98:33:8B:21:01:A6:C4:01:D5:53:3D:A0:0E:77:9A:77:AE:8F:05:4A:9A:50:B2
因為只設置了一台代理節點伺服器,所以我們將只看到一個請求。看起來類似如上,代理節點的完整域名即其主機名。
注意有沒有「+」號在前面,代表這個證書有沒有被簽名。
使用帶有主機名的 puppet cert sign
這個命令來簽署這個簽名請求,如下:
# puppet cert sign puppetnode.example.com
Notice: Signed certificate request for puppetnode.example.com
Notice: Removing file Puppet::SSL::CertificateRequest puppetnode.example.com at '/var/lib/puppet/ssl/ca/requests/puppetnode.example.com.pem'
主控伺服器現在可以通訊和控制它簽名過的代理節點了。
如果想簽署所有的當前請求,可以使用 -all
選項,如下所示:
# puppet cert sign --all
12. 刪除一個 Puppet 證書
如果我們想移除一個主機,或者想重建一個主機然後再添加它。下面的例子里我們將展示如何刪除 puppet 主控伺服器上面的一個證書。使用的命令如下:
# puppet cert clean hostname
Notice: Revoked certificate with serial 5
Notice: Removing file Puppet::SSL::Certificate puppetnode.example.com at '/var/lib/puppet/ssl/ca/signed/puppetnode.example.com.pem'
Notice: Removing file Puppet::SSL::Certificate puppetnode.example.com at '/var/lib/puppet/ssl/certs/puppetnode.example.com.pem'
如果我們想查看所有的簽署和未簽署的請求,使用下面這條命令:
# puppet cert list --all
+ "puppetmaster" (SHA256) 33:28:97:86:A1:C3:2F:73:10:D1:FB:42:DA:D5:42:69:71:84:F0:E2:8A:01:B9:58:38:90:E4:7D:B7:25:23:EC (alt names: "DNS:puppetmaster", "DNS:puppetmaster.example.com")
13. 部署 Puppet 清單
當配置並完成 puppet 清單後,現在我們需要部署清單到代理節點伺服器上。要應用並載入主 puppet 清單,我們可以在代理節點伺服器上面使用下面的命令:
# puppet agent --test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetnode.example.com
Info: Applying configuration version '1434563858'
Notice: /Stage[main]/Main/Exec[apt-update]/returns: executed successfully
Notice: Finished catalog run in 10.53 seconds
這裡向我們展示了主清單如何立即影響到了一個單一的伺服器。
如果我們打算運行的 puppet 清單與主清單沒有什麼關聯,我們可以簡單使用 puppet apply
帶上相應的清單文件的路徑即可。它僅將清單應用到我們運行該清單的代理節點上。
# puppet apply /etc/puppet/manifest/test.pp
14. 為特定節點配置清單
如果我們想部署一個清單到某個特定的節點,我們需要如下配置清單。
在主控伺服器上面使用文本編輯器編輯 /etc/puppet/manifest/site.pp
:
# nano /etc/puppet/manifest/site.pp
添加下面的內容進去
node 'puppetnode', 'puppetnode1' {
# execute 'apt-get update'
exec { 'apt-update': # exec resource named 'apt-update'
command => '/usr/bin/apt-get update' # command this resource will run
}
# install apache2 package
package { 'apache2':
require => Exec['apt-update'], # require 'apt-update' before installing
ensure => installed,
}
# ensure apache2 service is running
service { 'apache2':
ensure => running,
}
}
這裡的配置顯示我們將在名為 puppetnode 和 puppetnode1 的2個指定的節點上面安裝 apache 服務。這裡可以添加其他我們需要安裝部署的具體節點進去。
15. 配置清單模塊
模塊對於組合任務是非常有用的,在 Puppet 社區有很多人貢獻了自己的模塊組件。
在主控伺服器上, 我們將使用 puppet module
命令來安裝 puppetlabs-apache
模塊。
# puppet module install puppetlabs-apache
警告: 千萬不要在一個已經部署 apache 環境的機器上面使用這個模塊,否則它將清空你沒有被 puppet 管理的 apache 配置。
現在用文本編輯器來修改 site.pp
:
# nano /etc/puppet/manifest/site.pp
添加下面的內容進去,在 puppetnode 上面安裝 apache 服務。
node 'puppet-node' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}
保存退出。然後重新運行該清單來為我們的代理節點部署 apache 配置。
總結
現在我們已經成功的在 ubuntu 15.04 上面部署並運行 puppet 來管理代理節點伺服器的基礎運行環境。我們學習了 puppet 是如何工作的,編寫清單文件,節點與主機間使用 ssl 證書認證的認證過程。使用 puppet 開源軟體配置管理工具在眾多的代理節點上來控制、管理和配置重複性任務是非常容易的。如果你有任何的問題,建議,反饋,與我們取得聯繫,我們將第一時間完善更新,謝謝。
via: http://linoxide.com/linux-how-to/install-puppet-ubuntu-15-04/
作者:Arun Pyasi 譯者:ivo-wang 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive