puppet默认没有使用版本控制。可以在puppet.conf文件中添加一下一行:

config_version = /usr/local/bin/return_version

其中“/usr/local/bin/return_version” 是我自定义的脚本:

#!/bin/bash
date +%Y%m%d%H

so 简单 ^.^

注:puppet的这个版本号是用于与client端通信的信息,可以使用tagmail或者puppet的report功能,在基于webUI的dashboard或者foreman方便查阅自动化情况,通过时间判断是一个不错的办法。

svn的版本控制主要是对puppet部署的配置文件的控制,对于传送文件,使用exec执行客户端命令等操作不能进行回滚操作,需要自定义回滚方法(svn只负责svn服务器本地版本库内的文件系统)

1 安装svn

我使用yum安装:

#yum  install subversion mod_dav_svn mod_auth_mysql –y

2 确认是否已安装一下安装包:

openssl-XXX

openssl-devel-XXX

mod_ssl-XXX

mod_auth_mysql-XXX

subversion-XXX

mod_dav_svn-XXX

3 确认模块:

在/etc/httpd/modules(根据你的apache安装目录)

mod_authz_svn.so

mod_dav_svn.so

mod_auth_mysql.so

4 建立并创建svn版本库

#mkdir –p /opt/svn/puppet

#svnadmin create /opt/svn/puppet

5 修改SVN配置文件

#vi /opt/svn/puppet/conf/svnserve.conf(操作权限文件指定)

[general]
auth-access = write
password-db = passwd
authz-db = authz
realm = puppet

#vi /opt/svn/puppet/conf/password(容许访问SVN的用户及密码)

[users]
puppet = testpassword

#vi /opt/svn/puppet/conf/authz(用户对某目录及自动目录的访问权限,下面表示admin组对svn所有目录都有读写权限,admin的成员是puppet)

[groups]
admin = puppet
[/]
@admin = rw

6 启动svn

#svnserve -d –r /opt/svn/

7向版本库提交资源,我设置的路径是puppet模块的主目录(原因见下面的说明,默认为/etc/puppet,我指定到了其他路径,puppet.conf中指定)

#svn import –m “test” /usr/share/svn/modules  file:///opt/svn/puppet

8 svn还是需要系统学习的,这里只是一个开端,,为了让大家尽快懂得svn,下面介绍一些会用到的命令包括:

svn add * (将新修改的配置以及新添加的文件纳入版本控制,这是在修改量大的情况下,最简单快速的办法)

svn commit -m "一些更新信息" (将新修改的配置提交到版本库)

svn co file:///home/okooo/apps/svn/puppet tmp(将版本库的内容拷贝一个副本到这次操作的目录下的tmp目录-这个都可以定义,默认就是版本库的名字,本例中是puppet)

svn up (下载一份完整的版本库内容到操作的目录下)

svn cleanup (有些时候在别人修改时候文件被锁定等原因,运行这个命令可以解除锁定)

svn del manifests/node/java.pp(将版本库的某些内容删除,这里是删除java.pp,然后svn commit就会成功删除)

svn diff manifests/node/java.pp (将修改后的java.pp文件和版本库的同名文件对比不同的内容)

svn log (查看更新内容的日志,这个log显示出来的就是上面执行“svn commit -m” 后的内容)

....

因为我们不涉及开发维护,所以svn不需要太熟,但是还是建议掌握所有内容

SVN的hooks

钩子的功能其实我也迷糊了很久,我的理解就是在版本库出现修改时被触发的自定义脚本,这样可以确定很多属性:比如Pre-Commit钩子的作用是 代码提交前是否有写messages,是否有tab,是否有不允许上传的文件,是否有超过限制大小的文件等等,这样可以控制一些不合适的提交。

以下是一个Pre-Commit钩子,用于检查语法错误:

检查puppet的全部.pp配置文件是否有问题,也可以执行:

puppet -v  你的主要配置文件site.pp


#!/bin/sh
# SVN pre-commit hook to check Puppet syntax for .pp files
REPOS="$1"
TXN="$2"
tmpfile=`mktemp`
export HOME=/
SVNLOOK=/usr/bin/svnlook
$SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[^D].*\.pp$/ {print $2}' | while read line
do
    $SVNLOOK cat -t "$TXN" "$REPOS" "$line" > $tmpfile
    if [ $? -ne 0 ]
    then
        echo "Warning: Failed to checkout $line" >&2
    fi
    puppet --color=false --confdir=/etc/puppet --vardir=/var/lib/puppet --parseonly --ignoreimport $tmpfile >&2
    if [ $? -ne 0 ]
    then
        echo "Puppet syntax error in $line." >&2
        exit 2
    fi
done
res=$?
rm -f $tmpfile
if [ $res -ne 0 ]
then
    exit $res
fi