在CentOS 6.2上安裝Puppet配置管理工具
云計算時代系統管理員會經常陷入一系列的重復任務中,創建虛擬機,安裝或重裝系統,升級軟件包,管理配置文件,添加、管理和配置系統服務等。這些任務低效而且無聊,我們需要把他們自動化,于是就出現了系統管理員自己寫的腳本,用定制腳本實現自動化,但是自己寫的腳本要保證能順利運行在不同的平臺上不是一件輕松的工作,每次操作系統更新都需要重新測試定制腳本,耗費大量時間和精力,靈活性和功能也很難保證。而且腳本語言雖然簡單,但是自己寫的腳本不一定別的管理員就能馬上看懂,有時候自己看別人寫的腳本或代碼不是一件愉快的事情。所以出現了類似 Puppet, Chef 這樣的自動化配置管理工具。為啥 Linode 只有19人就能應付上千服務器上萬用戶,這就是自動化帶來的好處。
Puppet 是一個客戶端/服務器(C/S)架構的配置管理工具,在中央服務器上安裝 puppet-server 服務器(puppet master),在需要被管理的目標服務器上安裝 puppet 客戶端軟件(puppet client)。當客戶端連接上服務器后,定義在服務器上的配置文件會被編譯,然后在客戶端上運行。客戶端每隔半小時主動會和服務器通信一次,確認配置信息的更新情況,如果有新的配置信息(或者配置有變化),配置文件將會被重新編譯并分發到客戶端執行。當然,也可以在服務器上主動觸發更新指令來強制各客戶端進行配置更新。
以下安裝采用兩臺服務器,一臺是 master.vpsee.com 用來安裝 puppet-server 服務;一臺是 client.vpsee.com 用來安裝 puppet 客戶端。
Puppet 要求所有機器有完整的域名(FQDN),如果沒有 DNS 服務器提供域名的話,可以在兩臺機器上設置主機名(注意要先設置主機名再安裝 Puppet,因為安裝 Puppet 時會把主機名寫入證書,客戶端和服務端通信需要這個證書):
- # vi /etc/hosts
- 192.168.2.10 master master.vpsee.com
- 192.168.2.11 client client.vpsee.com
Puppet 要求所有機器上的時鐘保持同步,所以需要安裝和啟用 ntp 服務(如果采用 CentOS-6.2-x86_64-minimal.iso 最小化安裝,需要額外安裝這個軟件包)。
- # yum install ntp
- # chkconfig ntpd on
- # ntpdate pool.ntp.org
- 29 Feb 15:22:47 ntpdate[15867]: step time server 196.25.1.1 offset 98.750417 sec
- # service ntpd start
- Starting ntpd: [ OK ]
安裝 puppet 服務
Puppet 需要 Ruby 的支持,如果要查看命令行幫助的話需要額外 ruby-rdoc 這個軟件包:
- # yum install ruby ruby-lib ruby-rdoc
Puppet 不在 CentOS 的基本源中,需要加入 PuppetLabs 提供的官方源:
- # yum -y install wget
- # wget http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-1.noarch.rpm
- # yum install puppetlabs-release-6-1.noarch.rpm
- # yum update
在 master 上安裝和啟用 puppet 服務:
- # yum install puppet-server
- # chkconfig puppet on
- # service puppetmaster start
- Starting puppetmaster: [ OK ]
關閉 iptables:
- # /etc/init.d/iptables stop
- iptables: Flushing firewall rules: [ OK ]
- iptables: Setting chains to policy ACCEPT: filter [ OK ]
- iptables: Unloading modules: [ OK ]
安裝 puppet 客戶端
在 client 上安裝 puppet 客戶端:
- # yum install puppet
Puppet 客戶端使用 HTTPS 和服務端(master)通信,為了和服務器端通信必須有合法的 SSL 認證,第一次運行 puppet 客戶端的時候會生成一個 SSL 證書并指定發給 Puppet 服務端。
- # puppet agent --no-daemonize --onetime --verbose --debug --server=master.vpsee.com
Puppet 服務端接受到客戶端的證書后必須簽字(sign)才能允許客戶端接入,sign 后用 puppet cert list –all 查看會發現 client.vpsee.com 前面多了一個 + 后,表示 “加入” 成功:
- # puppet cert list --all
- client.vpsee.com (65:3C:20:82:AE:F6:23:A8:0A:0B:09:EF:05:64:1D:BB)
- + master.vpsee.com (AF:A0:32:78:D4:EB:D3:EE:02:1C:62:1C:83:3C:46:EC) (alt names: DNS:master, DNS:master.vpsee.com)
- # puppet cert --sign client.vpsee.com
- notice: Signed certificate request for client.vpsee.com
- notice: Removing file Puppet::SSL::CertificateRequest client.vpsee.com at '/var/lib/puppet/ssl/ca/requests/client.vpsee.com.pem'
- # puppet cert list --all
- + client.vpsee.com (65:3C:20:82:AE:F6:23:A8:0A:0B:09:EF:05:64:1D:BB)
- + master.vpsee.com (AF:A0:32:78:D4:EB:D3:EE:02:1C:62:1C:83:3C:46:EC) (alt names: DNS:mas
這樣,客戶端和服務端就配置好了,雙方可以通信了。
Hello, world
現在可以在服務端寫個小例子來測試一下。這個例子作用很簡單,用來在客戶端的 /tmp 目錄下新建一個 helloworld.txt 文件,內容為 hello, world. 在服務端編寫代碼:
- # vi /etc/puppet/manifests/site.pp
- node default {
- file {
- "/tmp/helloworld.txt": content => "hello, world";
- }
- }
在客戶端上執行 puppet,運行成功后會在 /tmp 看到新生成的 helloworld.txt:
- $ puppet agent --test --server=master.vpsee.com
- warning: peer certificate won't be verified in this SSL session
- info: Caching certificate for client.vpsee.com
- info: Caching certificate_revocation_list for ca
- info: Caching catalog for client.vpsee.com
- info: Applying configuration version '1330668451'
- notice: /Stage[main]//Node[default]/File[/tmp/helloworld.txt]/ensure: defined content as '{md5}e4d7f1b4ed2e42d15898f4b27b019da4'
- info: Creating state file /home/vpsee/.puppet/var/state/state.yaml
- notice: Finished catalog run in 0.03 seconds
- $ cat /tmp/helloworld.txt
- hello, world
如果想偷懶,可以直接使用 Example42 的開源 Puppet 模塊。