全部博文(2065)
分类: LINUX
2010-11-02 15:38:12
SVN管理puppet配置
时间:2010-10-28
一、前言
为了能够正常管理puppet的配置文件,研究了一下svn的钩子。发现这个东西功能比较强大。同时要非常感谢智弘兄弟的帮忙。及其贡献的钩子脚本。非常感谢!
二、版本库钩子
2.1 start-commit 开始提交的通知
输入参数:传递给你钩子程序的命令行参数,顺序如下:
1. 版本库路径
2. 认证过的尝试提交的用户名
3. Depth,mergeinfo,log-revprops
2.2 pre-commit 在提交结束之前提醒
输入参数:传递给你钩子程序的命令行参数。顺序是:
1. 版本库路径
2. 提交事务的名称
2.3 post-commit 成功提交的通知
传递给你钩子程序的命令行参数,顺序为:
1. 版本库路径
2. 提交创建的修订版本号
2.4 pre-revprop-change –修订版本属性修改的通知
这个钩子在修订版本属性修改之前,正常提交范围之外被执行,不像其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须要实际存在并且返回一个零值。
PS:其中本次应用中会使用到pre-commit及post-commit两个钩子
三、从零开始搭建一个SVN仓库并编写钩子
1. 建立SVN版本库目录(即你的SVN服务器里面的文件存放在哪个目录)
#mkdir -p /opt/svndata/repos1
说明:svn mkdir 是其实是相当于#mkdir && svn add 操作。只差一步commit操作
Svn有许多操作是可以直接一步到位进行的!
2. 有了目录现在就可以创建SVN版本库
#svnadmin create /opt/svndata/repos1/
3. 编辑SVN的配置文件主要是权限这块的相关配置信息
#vi /opt/svndata/repos1/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd #还可以指定到其它目录都是可以的
authz-db = authz
realm = repos1
4. 配置允许访问SVN的用户
#vi /opt/svndata/repos1/conf/passwd
[users]
test = test
5. 配置用户访问权限相关
#vi /opt/svndata/repos1/conf/authz
[groups]
admin = test
# harry_and_sally = harry,sally
[/]
@admin = rw
[repos1:/abc/aaa]
@admin = r
版本库目录格式:
[<版本库>:/项目/目录] #是以项目名作为第一个单位。试想肯定是以项目为单元的
@<用户组名> = <权限>
<用户名> = <权限>
其中,方框号内部分可以有多种写法:
/,表示根目录及以下。根目录是svnserve启动时指定的,我们指定为/opt/svndata。这样,/就是表示对全部版本库设置权限。
repos1:/,表示对版本库1设置权限
repos2:/abc, ,表示对版本库2中的abc项目设置权限
repos2:/abc/aaa, ,表示对版本库2中的abc项目的aaa目录设置权限
权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。
6. 启动svnserve -d -r /opt/svndata/
其中:
-d表示以daemon方式(后台运行)运行
-r /opt/svndata指定根目录是/opt/svndata
7. 现在有了仓库了就可以往仓库里面提交东西了。我们是以一个项目为单位的进行提交
#mkdir -p /var/www/dotproject 项目文件目录是在这。项目名称为dotproject
#svn import -m 'project' /var/www/dotproject svn://192.168.111.100/repos1
这个时候就会让你输入用户名与密码了
8. 从版本库中checkout东西
#mkdir myproj && cd myproj 表示全部的项目都存在这个目录下面
#svn checkout svn://192.168.111.100/repos1 dotproect 表示把repos1里面的项目搞出来。
看我测试权限:
# vi /opt/svndata/repos1/conf/authz
[groups]
admin = test
[repos1:/dotproject/]
@admin = r #让这个用户只有读的权限
现在到项目目录下面就不可以再commit动作了
至此SVN库成功编写完成!开始编写svn的钩子
#post-commit代码如下:
#!/bin/bash /usr/local/bin/svn update /etc/puppet/ --username test --password test >> /tmp/abc.out if [ $? == 0 ] then echo "ok" >> /tmp/abc.out fi |
这个文件权限为755。
#check.sh代码如下:
#/bin/bash REPOS=$1 TXN=$2 export HOME=/ export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin SVNLOOK=/usr/local/bin/svnlook #注意路径不要写错了! CAT="$SVNLOOK cat -t $TXN $REPOS" $SVNLOOK changed -t "$TXN" "$REPOS" |awk '$1~/^[^D]/{print $NF}' |while read line; do #bash syntax check # if echo $line |grep -q '\.sh$'; then # $CAT $line |bash -n 2>&2 && continue # echo "BASH SYNTAX ERROR: $line" >&2 # exit 4 # fi #perl syntax check if echo $line |grep -q '\.pl$'; then $CAT $line |perl -c 2>&2 && continue echo "PERL SYNTAX ERROR: $line" >&2 exit 4 fi #puppet syntax check if echo $line |grep -q '\.pp$'; then $CAT "$line" |puppet --color=false --parseonly --ignoreimport >&2 [ $? -eq 0 ] && continue echo "PUPPET SYNTAX ERROR: $line" >&2 exit 4 fi #erb syntax check if echo $line |grep -q '\.erb$'; then $CAT $line |erb -x -T '-' |ruby -c 2>&2 && continue echo "ERB SYNTAX ERROR: $line" >&2 exit 4 fi done |
3. 编写pre-commit代码
#!/bin/sh REPOS="$1" TXN="$2" /opt/svndata/repos1/hooks/check.sh $REPOS $TXN |
记得:将全部的文件权限赋给755。
四、测试
在客户端编写一个语法错误的配置文件然后试图提交。提示语法错误!
(全文完)