1 概述
通过安装部署Puppet C/S模型,实现Puppet Server端管理所有被控制机的整个生命周期:从初始化到软件升级、从配置文件创建到测试部署、从系统维护到服务器迁移等。Puppet能够持续化的与被控制机进行交互,从而实现配置文件的及时检测更新。结合SVN版本控制系统,puppet可在更新之前将当前正在运行的环境以版本的方式保存到SVN版本控制系统中,方便以后通过puppet更新出错或者需要回滚到之前的某一个环境时快速恢复。
2 环境部署
序号 服务器类型 版本/IP参数 1 PuppetMaster CentOS 6.5 i686 (192.168.56.1) 2 PuppetAgent CentOS 6.5 x86_64 (192.168.56.101) 3 PuppetAgent CentOS 6.5 x86_64 (192.168.56.102) 4 PuppetAgent CentOS 6.5 i686 (192.168.56.103) 5 PuppetAgent CentOS 6.5 i686 (192.168.56.104) 6 SVN Service rango.fugue.com 7 SVN Agent vm3.sysu(Linux) Windows7
所使用软件版本:
Subversion Version: subversion-1.6.11-9.el6_4.i686
TortoiseSVN: 1.8.2.24708-x64-svn-1.8.3
3 部署流程
3.1 SVN Server端部署
3.1.1 安装软件:yum install subversion
3.1.2 创建第一个版本库:mkdir /opt/svn
svnadmin create /opt/svn/puppet
更改版本库所有为apache用户组:chown -R apache.apache /opt/svn/puppet
3.2 通过apache+ssl安全认证访问SVN服务器
3.2.1 安装相关软件包:yum install httpd httpd-devel mod_dav_svn
3.2.2 创建SVN虚拟主机:vim /etc/httpd/conf.d/subversion.conf
LoadModuledav_svn_module modules/mod_dav_svn.so
LoadModuleauthz_svn_module modules/mod_authz_svn.so
Listen 8146
<VirtualHost *:8146>
<Location/svn>
DAV svn
SVNParentPath /opt/svn
AuthType Basic
AuthName "Subversion Realm"
SVNListParentPath on
AuthUserFile /opt/svn/puppet/conf/authfile
# AuthzSVNAccessFile /opt/svn/puppet/conf/svn-acl-conf
Require valid-user
SVNAutoversioning on
ModMimeUsePathInfo on
</Location>
</VirtualHost>
虚拟主机监听在8146端口,确保8146端口未被其他程序占用。
3.2.3 创建SVN权限配置文件
vim /opt/svn/puppet/conf/authz
[groups]
admin= puppet
[admin:/]
@admin= rw
[/]
*= r
[$name:/]
test= rw">>/opt/svn/puppet/conf/authz
3.2.4 创建用户名及密码并设置相应权限
/usr/bin/htpasswd -c /opt/svn/puppet/conf/authfile puppet #创建SVN服务器账户puppet密码为“yourkey”
echo "puppet = yourkey" >> /opt/svn/puppet/conf/passwd
3.2.5 配置SVN服务信息:
vim /opt/svn/puppet/conf/svnserve.conf
[general]
anon-access= none
auth-access= write
password-db= /opt/svn/puppet/conf/passwd
authz-db= /opt/svn/conf/authz
realm= puppet Repository
3.2.6 通过浏览器测试访问:/etc/init.d/httpd restart
http:/
/
192.168.56.1:8146/svn
/ 输入账户及密码即可
3.2.7 通过其他Linux节点访问测试:vm3.sysu
svn checkout http://192.168.56.1:8146/svn/puppet/ /mnt/
3.3 整合puppet server端
3.3.1 将puppetserver模块目录导入到版本库中:当svnserver,puppet server在同一台服务器上时
svn import /etc/puppet/ file:///opt/svn/puppet -m "Puppet moduleInspection"
3.3.2 通过浏览器访问查看SVN服务器:http://192.168.56.1:8146/svn/puppet
3.3.3 通过Windows客户端TortoiseSVNcheckout最新的版本库到本地
3.3.4 删除puppetmaster端puppet目录,并将版本库中的数据导出
rm -rf /etc/puppet
svn checkout http://192.168.56.1:8146/svn/puppet /etc/puppet/
cd /etc/puppet/ ; ls -a
每个目录下面都会生成.svn隐藏目录,用于保存当前版本的信息
checkout之后,在/etc/puppet/modules目录下就会有一份SVN服务器上最新版本的副本。
3.4 部署SVNhooks
3.4.1 设置pre-commit
设置pre-commit钩子可以提交文件到SVN服务器之前对puppet语法进行检查,语法通过则提交成功,语法错误则提交失败。
cd /opt/svn/ puppet/hooks/
cp pre-commit.tmpl pre-commit
chmod 774 pre-commit
vim pre-commit:
#!/bin/bash
#SVN pre-commit hook to check Puppet syntax for .pp files
export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
REPOS="$1"
TXN="$2"
tmpfile=`mktemp`
for file in $(svnlook changed -t "$TXN" "$REPOS" |awk '/^[^D].*\.pp$/ {print $2}')
do
svnlook cat -t $TXN $REPOS $file > $tmpfile
if[ $? -ne 0 ]
then
echo"Warning: Failed to checkout $file" >&2
fi
puppet parser validate $tmpfile >>/var/log/puppet/svn_pre-commit.log2>&1
if[ $? -ne 0 ]
then
echo "Puppet syntax error in $file" >>/var/log/puppet/svn_pre-commit.log 2>&1
exit 1
fi
done
3.4.2 设置post-commit
设置post-commit钩子可以在正确提交文件至SVN服务器之后,puppetmaster的模块目录/etc/puppet/modules会自动从SVN服务器上update最新的版本库到本地。
#!/bin/bash
#POST-COMMIT HOOK
REPOS="$1"
REV="$2"
export LANG=en_US.UTF-8
SVN=/usr/bin/svn
PUPPET_DIR=/etc/puppet
$SVN update $PUPPET_DIR --username puppet --password yourkey>>/var/log/puppet/svn_post-commit.log
3.5 SVN Client端部署测试
3.5.1 本地测试
1)导出版本数据库文件到本地,
svn checkout file:///opt/svn/puppet/mnt/puppet
2)创建并添加新的目录及文件
svn add /mnt/ssh
3)将修改后的文件提交到SVN服务器,此时版本库版本加1
svn commit -m “add ssh modules” /mnt/puppet/*
3.5.2 远程测试(Linux)
svn checkout http://192.168.56.1:8146/svn/puppet/ /mnt/
3.5.3 客户端TortoiseSVN测试(Windows)
4 总结
本文介绍了Puppet结合SVN版本控制系统实现版本的集中化备份和恢复,重点在于SVN服务器的搭建以及Puppet与SVN Server的融合。后续文章将会介绍Puppet负载均衡技术。
——RangChen