Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29335479
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: 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-commitpost-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目录设置权限

权限主体可以是用户组、用户或*,用户组在前面加@*表示全部用户。权限可以是wrwr和空,空表示没有任何权限。

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

四、测试

   在客户端编写一个语法错误的配置文件然后试图提交。提示语法错误!

 

 

(全文完)

 

阅读(1800) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-12-08 14:16:35

只要把内核吃透即可!

chinaunix网友2010-12-08 14:07:50

吃透LINUX内核与安全!

chinaunix网友2010-12-08 14:05:21

未来一年深入掌握LINUX!