關於 Puppet
Puppet 是一種 Linux、Unix、Windows 平臺的集中配置管理系統,使用自有的 Puppet 描述語言,可管理配置檔案、使用者、cron任務、軟體包、系統服務等。Puppet把這些系統實體稱之為資源,其設計目標是簡化對這些資源的管理以及妥善處理資源之間的依賴關係。
在這一系列中,作者提供了一個可操作的全面教程,來逐步解釋如何使用 Puppet 搭建一個集中式管理的 Linux 伺服器基礎結構。
目標讀者
我相信有一類Linux系統管理員會從這個系列教程中收穫最多,他們已經在管理一個小規模的伺服器系統網路,想知道如何擴大現有的基礎結構,並且為管理新增系統付出的的時間和精力,不會和新增系統的數目成正比。或許你目前在管理5個伺服器系統,你可以問一下自己有沒有更好的方法,可以在不增加人手的情況下,來管理50個伺服器系統。或者你已經聽說過集中式配置管理和Puppet, 並且渴望嘗試一下。
先決條件
如果你的電腦安裝了Linux、Windows 或者 Mac OS X 桌面作業系統,擁有至少4G記憶體,16G可用磁碟空間,並且CPU可以執行虛擬機器,那就足夠了。所有你要做的事情和需要的資訊,我會在這個系列課程中為你說明。
開始
我無需說服你使用Puppet實現基於工具的配置管理,既然你能讀到這裡,你可能已經想要使用它了,所以讓我們馬上開始吧。
我承諾這是一個易上手的全面的教程,為此,我們需要準備一個環境,這樣我們可以不僅可以討論如何使用Puppet,而且能夠建立一個雖然很小但是真實的伺服器基礎結構,在這個基礎結構中,我們會執行一個Puppet伺服器,它會管理一個Puppet客戶端。換句話說,我們需要兩個Linux虛擬機器。
在這個教程中,我願意使用兩個 Ubuntu 12.04 LTS Precise Pangolin 系統,這只是因為我對這個Linux發行版本最有經驗。如果你使用更新版本的Ubuntu或者Debian 7.0 Wheezy,那麼這裡描述的步驟應該不會有很大的區別。
我們要做的第一件事情是從Oracle網站下載安裝VirtualBox。這是一個免費的虛擬機器管理軟體,我們可以使用它來執行上面提到的兩個虛擬Ubuntu系統。在寫這篇教程時,VirtualBox的最新發布版本是4.3.8-92456,你可以前往http://download.virtualbox.org/virtualbox/4.3.8/ ,然後根據使用的作業系統,來下載VirtualBox-4.3.8-92456-Win.exe, VirtualBox-4.3.8-92456-OSX.dmg, 或者 VirtualBox-4.3.8-92456-Linux_amd64.run。一旦下載完成後,你就可以使用預設選項進行安裝了。
一旦將VirtualBox安裝到你的電腦後,你就需要下載Ubuntu 12.04 LTS 64位伺服器版本的安裝媒介了,你可以前往 http://releases.ubuntu.com/12.04/, 然後選擇64-bit PC (AMD64) server install CD 連結來進行下載,我們會使用這個ISO來安裝兩個虛擬機器。
一旦將ISO檔案完全下載到你的電腦後,你可以開啟VirtualBox,在Machine選單下選擇New…。
我們開始安裝虛擬機器,這個虛擬機器會被當做Puppet伺服器,因此在彈出視窗中,我們將虛擬機器的名字設定為puppetserver。接下來將Type設定為Linux,將Version設定為Ubuntu(64bit)。 將記憶體大小設定為512M就足夠了。讓VirtualBox來為虛擬機器建立一個硬碟檔案(將大小設定為8G就足夠了)。
現在你就可以啟動最新建立的虛擬機器了。VirtualBox會向你詢問安裝媒介,這裡需要指向你已經下載完畢的Ubuntu ISO檔案的路徑。
VirtualBox就會啟動虛擬機器並引導進入Ubuntu的安裝CD,選擇English作為安裝過程中使用的語言,然後選擇Install Ubuntu Server繼續安裝。
在安裝過程中,你應該進行如下設定:
- 語言:English
- 國家:選擇你的國家
- Locale:en_US.UTF-8
- 鍵盤:選擇最適合你需要的鍵盤佈局
- 預設使用者:ubuntu,密碼ubuntu
- 加密home目錄:No
- 時區:選擇你所在的時區
- 分割槽:Guided – use entire disk
- 當被詢問需要安裝哪些包時,只選擇OpenSSH server。
- 將grub安裝進MBR
- 將系統時鐘設定為UTC
- 不要自動安裝安全更新。
一旦第一個虛擬機器的安裝完成後,啟動它並進入。然後,我們建立第二個虛擬機器,這個虛擬機器是我們的puppet客戶端。你可以參考安裝第一個虛擬機器時的處理方式,但其中有一個例外:在VirtualBox內部安裝Ubuntu的過程中,將第二臺虛擬機器的名字設定為 puppetclient,而不是 puppetserver。
在完成安裝後,你可以像操作第一臺虛擬機器那樣,啟動並進入第二臺虛擬機器。這時你會看到兩個VirtualBox的視窗,都在執行Ubuntu 12.04, 都向你提示輸入登入資訊。接下來,我們需要對VirtualBox進行一些配置,因此你需要登陸到兩臺虛擬機器(使用者名稱:ubuntu,密碼:ubuntu),然後通過命令sudo poweroff來關閉它們。
網路
因為我們要建立一個Puppet伺服器和客戶端,所以這兩臺虛擬機器需要通過網路彼此通訊。同時,如果能夠從我們自己的電腦連線到這兩臺虛擬機器,也會比較方便,這樣我們可以通過SSH的方式連線到虛擬機器,而不是通過一個很小的不易用的VirtualBox控制檯。最後還有重要的一點,這兩臺虛擬機器需要能夠連線到網際網路,這樣才可以安裝相關軟體。
為了實現這些,我們需要兩個虛擬的網路,一個Host-only網路和一個NAT網路。這兩臺虛擬機器則各需要有兩個乙太網介面卡,其中eth0用來連線到Host-only網路,eth1用來連線到NAT網路。
Host-only網路允許這兩臺虛擬機器可以彼此連線,也允許我們可以使用自己的電腦連線到這兩臺虛擬機器上。NAT網路則允許這兩臺虛擬機器可以訪問網際網路。
VirtualBox本身已經建立了這兩種網路。選擇File -> Preference,然後找到Network,其中NAT Networks選項卡中雖然沒有列出任何網路,但其實一直會存在一個可用的網路,因此我們不需要再額外配置一個。然後切換到Host-only Networks選項卡。我們需要確保有一個名為vboxnet0的網路是可用的。點選在列表旁邊的小螺絲刀圖示,在彈出的視窗中,需要確認Adapter和DHCP Server的配置如下所示。
在Host-only網路中,我們自己的電腦的IP地址被自動設定為192.168.56.1,我們的puppetserver虛擬機器應該設定為192.168.56.2,puppetclient虛擬機器應該設定為192.168.56.3。
為了做到如上配置,我們需要在兩個虛擬機器內開啟Settings對話方塊,找到Network,然後將Adapter 1繫結到Host-only Adapter,並將Name設定為vboxnet0。然後將Adapter 2繫結到NAT(注意:不是NAT Network!)。這些配置在兩臺虛擬機器上必須保持一致。
現在啟動兩臺虛擬機器並使用ubuntu使用者資訊登入系統。我們需要在兩臺虛擬機器內編輯/etc/network/interfaces檔案來配置網路介面。對於puppetserver來說,該檔案如下所示。
/etc/network/interfaces on puppetserver
1 2 3 4 5 6 7 8 9 10 |
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.56.2 netmask 255.255.255.0 auto eth1 iface eth1 inet dhcp |
對於 puppetclient 來說,該檔案如下所示。
/etc/network/interfaces on puppetclient
1 2 3 4 5 6 7 8 9 10 |
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.56.3 netmask 255.255.255.0 auto eth1 iface eth1 inet dhcp |
如你所見,這兩臺虛擬機器的配置中,唯一不同的地方就是IP地址。通過如上配置,我們的虛擬機器就可以通過eth1來訪問網際網路,並通過eth0中設定的靜態IP地址來訪問彼此。
最後一步,我們需要將兩臺虛擬機器的名字放到兩臺虛擬機器的hosts檔案中,這樣我們就可以通過名字而不是IP地址來訪問它們。puppetserver虛擬機器上的etc/hosts檔案內容如下所示。
/etc/hosts on puppetserver
1 2 3 4 5 6 7 8 9 10 |
127.0.0.1 localhost 127.0.1.1 puppetserver 192.168.56.3 puppetclient # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
puppetclient虛擬機器上的/etc/hosts檔案內容如下所示。
/etc/hosts on puppetclient
1 2 3 4 5 6 7 8 9 10 |
127.0.0.1 localhost 127.0.1.1 puppetclient 192.168.56.2 puppetserver # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
在重啟兩臺虛擬機器後,你應該能夠從puppetserver虛擬機器上成功執行ping puppetclient命令,反過來也可以從puppetclient虛擬機器上成功連線到puppetserver虛擬機器,同樣你也應該能夠在自己的電腦上成功執行 ping 192.168.56.2 和 ping 192.168.56.3。
搭建Puppet伺服器
現在,我們已經建立了Puppet伺服器和Puppet客戶端的虛擬機器,在虛擬機器上安裝了Ubuntu,並配置好了網路並正在執行,我們可以開始搭建Puppet伺服器系統了。
Ubuntu軟體庫為我們提供了將伺服器系統變為Puppet伺服器所需的全部內容,我們不需要手動安裝任何軟體或者操作外部軟體包。
為了安裝必要的軟體包,我們需要使用ubuntu使用者登入到puppetserver虛擬機器,然後執行如下命令。
On the puppetserver VM
1 2 |
~# <strong>sudo apt-get update ~# <strong>sudo apt-get install puppetmaster |
我們不需要做其他步驟了,現在Puppet伺服器可以使用一個合理的預設配置來執行了。
搭建Puppet客戶端
建立Puppet客戶端(或者用Puppet術語,代理)並在puppetclient虛擬機器上執行它,和建立Puppet伺服器並沒有太大的區別。首先我們需要安裝Puppet客戶端軟體包。
On the puppetclient VM
1 2 |
~# sudo apt-get update ~# sudo apt-get install puppet |
然後,我們需要編輯etc/puppet/puppet.conf檔案,來告訴Puppet代理Puppet伺服器的域名,為此我們需要在該檔案中新增一行:server=puppetserver。
/etc/puppet/puppet.conf on puppetclient
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[main] server=puppetserver logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet factpath=$vardir/lib/facter templatedir=$confdir/templates prerun_command=/etc/puppet/etckeeper-commit-pre postrun_command=/etc/puppet/etckeeper-commit-post [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 |
這樣設定後,客戶端就可以連線到puppetserver虛擬機器上的Puppet master程式了,但它還不能真正和伺服器進行通訊,因為它還沒有在已驗證並允許的客戶端列表裡面。為了實現這一點,我們需要發起從客戶端到伺服器的第一個連線。
在 puppetclient VM
1 |
~# sudo puppet agent --verbose --no-daemonize --onetime |
這會向Puppet master程式發起一個連線,這個程式會監聽puppetserver虛擬機器上的8140埠。這個連線的輸出會很詳細,然後客戶端(代理)就不再繼續以後臺daemon的方式執行。同時,它只會執行一次,也就是說,當這個連線關閉後,代理程式也會結束。
如果所有的配置都正確,那麼第一次執行時的輸出如下所示。
在 puppetclient VM 上,執行 Puppet 代理之後,
1 2 3 4 |
info: Creating a new SSL key for puppetclient info: Creating a new SSL certificate request for puppetclient info: Certificate Request fingerprint (md5): 20:74:A7:BD:69:5D:50:8D:6A:79:67:6E:DC:5E:41:E0 Exiting; no certificate found and waitforcert is disabled |
這個看上去似乎像是一個錯誤,但它實際上不是。客戶端已經通過這次執行讓伺服器知道了它的資訊了,但是伺服器還沒有接受這個客戶端。下一步,我們必須簽署puppetclient虛擬機器已經建立的SSL認證請求,並將其傳送給伺服器。我們可以通過如下命令在伺服器上檢視那些還沒有被簽署的認證請求列表。
在 puppetserver VM 上
~# sudo puppet cert --list
這個命令會列印如下的列表。
在 puppetserver VM 上
"puppetclient" (20:74:A7:BD:69:5D:50:8D:6A:79:67:6E:DC:5E:41:E0)
現在我們可以簽署這個請求,這樣我們就允許客戶端在接下來的連線中可以收到伺服器的資訊。
在 puppetserver VM 上
1 2 3 4 |
~# sudo puppet cert --sign puppetclient notice: Signed certificate request for puppetclient notice: Removing file Puppet::SSL::CertificateRequest puppetclient at '/var/lib/puppet/ssl/ca/requests/puppetclient.pem' |
切換回puppetclient虛擬機器,我們現在能夠初始化一個指向伺服器的完整連線了。
在 puppetserver VM 上
1 2 3 4 5 6 7 8 |
~# sudo puppet agent --verbose --no-daemonize --onetime info: Caching certificate for puppetclient info: Caching certificate_revocation_list for ca info: Caching catalog for puppetclient info: Applying configuration version '1395687915' info: Creating state file /var/lib/puppet/state/state.yaml notice: Finished catalog run in 0.02 seconds |
就是這樣——我們的Puppet基礎結構已經完全建好並開始執行了。但是,在這個基礎結構還並不能做任何事情。我們的目標是通過執行在puppetserver虛擬機器上的Puppet master,來管理puppetclient虛擬機器上的配置。但是我們目前還沒有定義任何資訊來觸發客戶端的配置改動。這就是我們要在使用Puppet來構建可管理的伺服器基礎結構: 第二部分會涉及的內容。
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式