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