前言
puppet使用了有一段時間了,之前寫的手順書一直未發布到blog上來,今天正好有空,寫下一點筆記。公司在用的服務器有500多台,基本都為CentOS,版本有5和6兩種,管理起來很不方便,尤其是部署監控,其中有大量重復性工作,使用puppet可以方便很多。
簡介
安裝前,簡介當然是一定要有的啦,簡單介紹下吧。puppet是基於客戶端和服務器端的C/S架構,基於ruby開發。所以,你要明白,安裝puppet,就需要安裝配置ruby。web管理界面類似於redmine的安裝,使用apache的passenger模塊整合。
服務器端部署
URL:http://yum.puppetlabs.com/el/5/products/i386/
Packages:
puppetlabs-release-5-6.noarch.rpm(puppet repo)
puppet-dashboard-1.2.23-1.el5.noarch.rpm(puppet-dashboard)
rpm –ivh puppetlabs-release-5-6.noarch.rpm rpm –ivh puppet-dashboard-1.2.23-1.el5.noarch.rpm yum install puppet-server puppetdb puppetdb-termius(后面兩個可以不裝)
2、Install ruby、mysql、apache_passenger module
參見安裝 redmine文檔。對於puppet.conf 來說,里面分成3部分[main], [master], [agent], 外面的文檔,有些是把參數添加到[main], 有些是添加到[agent], 用初學者比較困惑,到底那個是正確。對於agent來說,你就在agent里修改就可以。如果你的設置和[main]沖突,就會保留[agent]設置。所以你基本就不需要管[main]設置就可以。
/etc/sysconfig/puppetmaster 不用修改
/etc/sysconfig/puppet 不用修改
/etc/puppet/puppet.conf 不用修改
執行:/etc/init.d/puppetmaster start
rpm –ivh puppetlabs-release-5-6.noarch.rpm yum install puppet /etc/puppet/puppet.conf 修改如下內容,值為puppet服務器的hostname PUPPET_SERVER=server.example.com 執行 /etc/init.d/puppet start
或者不修改配置文件,直接puppet agent –server=server.example.com
查看服務端證書
puppet cert list –all
查看模塊位置
puppet config print modulepath
查看報告
Puppet agent –t –summarize
6、Certificate Register
客戶端agent啟動時候會給服務器發送證書申請在服務器上有上述命令查看證書,然后簽名
puppet cert sign station3.example.com
7、 Certificate Cancle
(1)注銷證書puppet cert revoke station3.example.com(只是讓證書失效)
puppet cert clean station3.example.com (刪除證書)
重啟puppetmaster
此時,station3.exmaple.com不能連接到puppet server(2)重新注冊證書
在客戶端
rm -f /var/lib/puppet/ssl/certs/station3.example.com.pem rm -f /var/lib/puppet/ssl/certificate_requests/station3.example.com.pem
然后重啟puppet,在服務器端執行puppet cert list就能看見重新申請證書。
(3)自動注冊證書可以設置master自動簽發所有的證書,我們只需要在/etc/puppet 目錄下創建 autosign.conf 文件。(不需要修改 /etc/puppet/puppet.conf文件,因為我默認的autosign.conf 文件的位置沒有修改)
vim /etc/puppet/autosign.conf
*.exmaple.com
這樣所有來自example.com域上的所有客戶端就自動注冊了。
8、 puppet dashboard(1) 修改my.cnf
在[mysqld]模塊下添加max_allowed_packet = 32M
(2)創建數據庫
CREATE DATABASE dashboard_production CHARACTER SET utf8; CREATE USER 'dashboard'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON dashboard.* TO 'dashboard'@'localhost'; FLUSH PRIVILEGES;
(3)編輯 /usr/share/puppet-dashboard/config/database.yml
(4)修改時區 /usr/share/puppet-dashboard/config/environment.rb#config.time_zone = 'UTC'
config.time_zone = 'Beijing'
(5) 配置apache
vim /etc/httpd/conf.d/puppet.conf LoadModule passenger_module /usr/local/ruby/lib/ruby/gems/1.8/gems/passenger-3.0.18/ext/apache2/mod_passenger.so PassengerRoot /usr/local/ruby/lib/ruby/gems/1.8/gems/passenger-3.0.18 PassengerRuby /usr/local/ruby/bin/ruby Listen 3001 <VirtualHost *:3001> ServerName server.example.com # !!! Be sure to point DocumentRoot to 'public'! DocumentRoot /usr/share/puppet-dashboard/public <Directory /usr/share/puppet-dashboard/public > # This relaxes Apache security settings. AllowOverride all # MultiViews must be turned off. Options -MultiViews </Directory> </VirtualHost>
這樣puppet就跟redmine一樣用apache的方式啟動了。
(6)初始化數據庫cd /usr/share/puppet-dashboard/
rake RAILS_ENV=production db:migrate
(7) 導入reports(默認在/var/lib/puppet/reports目錄下)
cd /usr/share/puppet-dashboard/
rake RAILS_ENV=production reports:import REPORT_DIR= /var/lib/puppet/reports
(8)Delayed Job Workers
cd /usr/share/puppet-dashboard/ env RAILS_ENV=production script/delayed_job -p dashboard -n 4 -m start(開始分析reports) ps -ef|grep delayed_job|grep -v grep(查看delayed_job 進程) env RAILS_ENV=production script/delayed_job -p dashboard -n 4 -m stop(停止分析)
注意這個進程不要停掉,要一直存在,所以么,有時候重啟服務器會忘記,干脆寫入到/etc/rc.local中
客戶端部署
既然puppet是C/S架構的,所以還得在每台服務器上部署客戶端,但是500多台服務器,不可能手工的一台一台去部署,自然通過腳本的方式。
部署前提
(1)免認證
對於500台及以上的服務器集群,應用之間的耦合度非常高,而且為了管理方便,一般都有操作系統層級的互信,也就是ssh免認證。
當然,有人會說這樣會有內網安全的隱患,如果控制了一台服務器,那么整個內網都將淪陷。是的,一點沒錯。安全跟便利本身就是相互矛盾的,我認為對於IDC服務器集群架構的安全防護主要還是從防火牆訪問限制和權限控制上着手,要既能保證業務正常運作也能保證服務器本身的安全。
(2)hosts文件
由於是服務器集群,所有服務器之間的信任一般都是通過/etc/hosts文件記錄其他服務器hostname跟IP的映射關系。
部署過程
基於內網中服務器之間的免認證,我們可以使用腳本將安裝腳本推送到所有服務器上,然后再執行安裝腳本,這樣就是實現了puppet客戶端的自動安裝。
安裝腳本,install_puppet.sh
#!/bin/bash version5=0 version6=0 [ -f /etc/init.d/puppet ]&& /etc/init.d/puppet restart [ -f /etc/sysconfig/puppet ]&& exit version5=`/bin/cat /etc/issue|head -1|grep '5.'|wc -l` if [ $version5 = 1 ];then rpm -ivh http://yum.puppetlabs.com/el/5/products/i386/puppetlabs-release-5-6.noarch.rpm yum -y install puppet puppet agent --server server.example.com [ -f /sbin/chkconfig ]&&`chkconfig puppet on` #echo "centos 5" else version6=`/bin/cat /etc/issue|head -1|grep '6.'|wc -l` if [ $version6 = 1 ];then rpm -ivh http://yum.puppetlabs.com/el/6/products/i386/puppetlabs-release-6-6.noarch.rpm yum -y install puppet puppet agent --server server.example.com [ -f /sbin/chkconfig ]&&`chkconfig puppet on` #echo "centos 6" fi fi
推送腳本push.pl,基於/etc/hosts文件中的記錄。
#!/usr/bin/perl -w if (@ARGV) { foreach (@ARGV) { if ($ARGV[0] =~ "all") { open(FILE,"</etc/hosts")||die"cannot open the file: $!\n"; while (<FILE>) { if ($_ =~ /^10/) { my @host=split; print "########It's coping file to $host[1]########\n"; system("/usr/bin/rsync install_puppet.sh $host[0]:/"); system("/usr/bin/ssh $host[0] /install_puppet.sh"); } } close FILE; } else { print "########It's coping file to $_########\n"; system("/usr/bin/rsync install_puppet.sh $_:/"); system("/usr/bin/ssh $_ /install_puppet.sh"); } } } else { print "1.Usage: $0 hostname1 hostname2 ... \n"; print "2.Usage: $0 all\n"; }
這樣執行將兩個腳本放在同一目錄,然后執行./push.pl all,然后就不用管了,所有服務器都自動部署對應版本的puppet客戶端了。