如何使用git或其他VCS在应用程序运行时更改版本控制服务器configuration文件?

我正在运行一个Minecraft服务器(craftbukkit),我还有其他几个想要访问修改服务器configuration文件的pipe理员。 跟踪他们所有的变化是非常重要的,所以git自然是一个不错的select。

请注意,这个问题可能涉及很多情况, 这不是特定的Minecraft。

有几个使用git来pipe理网站的教程。 最常见的解决scheme似乎是使用post-receive钩子对web目录执行结帐操作。 但是,在我的情况下,这提出了一些问题。

首先,需要编辑的某些文件pipe理员在运行时被服务器更改 。 我假设这会混淆git,如果我把服务器目录本身进入存储库。 使用post-receive checkout解决scheme,如果我是正确的(我还在学习git),那么这个问题就不会那么成问题了。

我还需要将服务器所做的更改推送到回购站中,以便pipe理员可以将这些更改提取到本地回购站。 我已经看到使用inotifywait的解决scheme,但这些似乎只是为了解决单个文件的变化。 我的服务器有50-80个configuration文件,当服务器运行时更​​改它们时,我需要跟踪和自动提交。 什么是处理这个最好的方法?

请注意,使用git不是必需的。 我只是喜欢我迄今为止所使用的。 如果有更好的工具可以使用,只要用户友好就可以使用。 请注意,我的服务器pipe理员不是编码员,也不是Linux高级用户,因此用户友好性有所帮助。

我最初发布在StackOverflow上,但被告知它更适合在这里。

这不是一个完整的答案,但希望有一些有用的想法:

inotifywait将愉快地工作与多个文件,并可以recursion设置目录观察点。 例如,我可以运行:

inotifywait -m -r -e close_write /etc 

并在编辑/etc/passwd/etc/postfix/main.cf后获得以下日志:

 /etc/ CLOSE_WRITE,CLOSE .passwd.swpx /etc/ CLOSE_WRITE,CLOSE .passwd.swp /etc/ CLOSE_WRITE,CLOSE 4913 /etc/ CLOSE_WRITE,CLOSE passwd /etc/ CLOSE_WRITE,CLOSE .passwd.swp /etc/postfix/ CLOSE_WRITE,CLOSE .main.cf.swx /etc/postfix/ CLOSE_WRITE,CLOSE .main.cf.swp /etc/postfix/ CLOSE_WRITE,CLOSE 4913 /etc/postfix/ CLOSE_WRITE,CLOSE main.cf /etc/postfix/ CLOSE_WRITE,CLOSE .main.cf.swp 

您可以非常轻松地将其应用到脚本中,在每次执行close_write事件时,都会将该文件提交到本地存储库,并将更改推送到远程服务器。

另外请注意, incron是一种用于自动化这种基于inotify的工作stream程的漂亮工具(但不会实质性地改变解决scheme的性质)。

如果您的pipe理员将编辑在运行时由服务器更新的相同文件,则会遇到困难。 这表明你将不得不在服务器上设置某种自动的冲突解决scheme,这总会导致丢失一些信息(至less明显的损失,至less,你显然可以在两个不同的分支中保留冲突的变化存储库,但服务器只能看到一个分支)。

我不认为这个问题或解决scheme的任何部分是特别的git。 您将会遇到任何分布式,asynchronous同步的共享文件维护问题。

我在类似的情况下做了什么是使实时configuration库(我倾向于使用Bazaar),并写了一个cronjob自动提交任何更改。 拥有VCS存储库的实时configuration应该不成问题 – 唯一的区别是.git目录,在大多数情况下应该忽略它。 cronjob的间隔将是你满意的任何粒度。 对于我的情况,每个小时都已经足够了,但是如果有必要的话,可能每隔5分钟,甚至1分钟。

有几个使用git来pipe理网站的教程。 最常见的解决scheme似乎是使用post-receive钩子对web目录执行结帐操作。

对于configuration文件,看看etckeeper :

 Name : etckeeper Arch : noarch Version : 0.63 Release : 1.el5 Size : 36 k Repo : epel Summary : Store /etc in a SCM system (git, mercurial, bzr or darcs) URL : http://kitenet.net/~joey/code/etckeeper/ License : GPLv2+ Description: The etckeeper program is a tool to let /etc be stored in a git, : mercurial, bzr or darcs repository. It hooks into yum to automatically : commit changes made to /etc during package upgrades. It tracks file : metadata that version control systems do not normally support, but that : is important for /etc, such as the permissions of /etc/shadow. It's : quite modular and configurable, while also being simple to use if you : understand the basics of working with version control. : : The default backend is git, if want to use a another backend please : install the appropriate tool (mercurial, darcs or bzr). : To use bzr as backend, please also install the etckeeper-bzr package. : : To start using the package please read /usr/share/doc/etckeeper-0.63/README 

首先,需要编辑的某些文件pipe理员在运行时被服务器更改

没问题。

我还需要将服务器所做的更改推送到回购站中,以便pipe理员可以将这些更改提取到本地回购站。

默认情况下, etckeeper作为cron作业每天运行:

/etc/cron.daily/etckeeper

 #!/bin/sh set -e if [ -x /usr/bin/etckeeper ] && [ -e /etc/etckeeper/etckeeper.conf ]; then . /etc/etckeeper/etckeeper.conf if [ "$AVOID_DAILY_AUTOCOMMITS" != "1" ]; then # avoid autocommit if an install run is in progress lockfile=/var/cache/etckeeper/packagelist.pre-install if [ -e "$pe" ] && [ -n "$(find "$lockfile" -mtime +1)" ]; then rm -f "$lockfile" # stale fi if [ ! -e "$lockfile" ]; then AVOID_SPECIAL_FILE_WARNING=1 export AVOID_SPECIAL_FILE_WARNING if etckeeper unclean; then etckeeper commit "daily autocommit" >/dev/null fi fi fi fi 

如果你还想推进远程回购,编辑上面的文件如下:

  if etckeeper unclean; then etckeeper commit "daily autocommit" >/dev/null cd /etc && git push origin master fi 

如果每天甚至每分钟间隔都不够, Watcher可以在更改之后立即提交configuration文件:

/etc/watcher.ini

 [DEFAULT] logfile=/tmp/watcher.log pidfile=/tmp/watcher.pid [job1] watch=/etc events=create,delete,write_close recursive=true autoadd=true command=cd /etc && etckeeper commit "daily autocommit" >/dev/null && git push origin master 

试一试。