有什么解决scheme允许使用服务器configuration文件的版本控制?

在具有多个系统pipe理员的环境中,将服务器configuration文件添加到版本控制系统中看到了一些优势。 最值得注意的是追踪变化的能力,是谁制造的,当然也可以回滚到已知的工作configuration。

我主要对Unix / Linux解决scheme感兴趣,但也会对Windows实现感到好奇。

我已经在家里(〜3台主机)testing了一段时间,尝试了不同的scms(RCS,Subversion,git)。 现在完全适合我的设置是与setgitperms挂钩混帐。

你需要考虑的事情是:

处理文件权限和所有权

  • RCS:原生做这个
  • Subversion:最后我试了一下,你需要一个围绕svn的包装来做到这一点
  • git: setgitperms钩子透明地处理这个(虽然需要一个支持post-checkout钩子的相当新的git版本)

另外,如果你不想要所有的/etc在版本控制下,而只是你实际上修改过的文件(比如我),你需要一个支持这种用法的scm。

  • RCS:无论如何只能用于单个文件。
  • Subversion:我觉得这很棘手。
  • git:没有probem,在顶级.gitignore文件中加“ * ”,只添加你想要的文件,使用git add --force

最后,在/etc下有一些有问题的目录,其中包可以删除configuration片段,然后由某些程序或守护进程( /etc/cron.d等)读取。 其中一些程序很聪明,可以忽略RCS文件(例如cron),有些则不是(例如modprobe)。 与.svn目录一样的东西。 git的一大优点(只创build一个顶级的.git目录)。

我用git非正式地完成了这个工作,但是还有一个更完善和详细的实现的etckeeper项目。

另一个select是使用像Puppet或Cfengine这样的自动服务器configuration工具来以声明性语言编写服务器configuration的脚本。

这是在前端额外的工​​作,但使用像Puppet这样的实用程序允许您自动重build和configuration一个人为干预很less的服务器。

我一直在试用etckeeper ,这似乎工作得很好。 我不需要中央服务器,这在某些情况下可能很重要。 您可以使用几个不同的DVCS后端,因此您可以select您最熟悉的一个。 它似乎对我来说工作得很好,但是我还没有尝试让我开始使用它的其他技术。

最近我一直在找厨师 。 它不仅在版本控制中保持模板化 (.erb)configuration,而且允许您执行操作(如将configuration上载到节点后重新启动服务 )。 厨师帮助包pipe理,以便您可以validation与您连接的任何节点(即必须安装sudo包)的依赖关系 。 厨师似乎很容易在Ruby中扩展,所以如果你有任何自定义的过程,你可以在提供的框架内编写脚本。

但仍然没有尝试过,你必须安装Ruby的客户端和服务器与适当的gem(这真的不那么难)。 总体而言,看起来很容易一次pipe理许多服务器。

我正在整个基础架构中实施Puppet,它有助于保持数据的版本控制。

我更喜欢Mercurial,因为它只是一些元数据存储在隐藏目录(易于pipe理,易于理解,易于使用)的文件集合。

我的木偶文件位于/ usr / local / etc / puppet /(FreeBSD 7.1)。 只需要添加Mercurial就可以了:

 > cd /usr/local/etc/puppet > hg init 

所有的改变都是通过一个简单的“hg commit”来完成的。 如果一个变化引起了一些东西,我可以用一个命令将每一个服务器回滚到给定版本的文件(比如sudoers)。

伟大的介绍Mercurial

我一直在我pipe理的服务器上使用Subversion。 工作正常。 我还设置了一个Trac实例,所以我们有一个时间表视图,票务系统,浏览等

使用符号链接,cron和subversion我还设置了基于subversion版本库的自动化configuration分发,每个Linux服务器都使用svn update来更新一个版本库(例如防火墙脚本)。

这里有一个真实的用例:使用Subversion来pipe理4台不同服务器上的configuration文件。 我build议使用configuration文件的版本控制,因为你可以在代码中使用它们 – 这是一个备份和一个撤消button。 如果我pipe理的服务器数量要多得多,而且在configuration方面更接近一些,那么我会使用类似Puppet的东西,详见berberich的答案。

这个想法是,你可以有一个仓库,你可以签出服务器上的特定文件夹(例如。/ var / named /),所以我都有一个历史和configuration文件的备份(备份是一个奖金,如果你犯了这个错误使用GUIconfiguration应用程序擦拭你的手编辑添加咳嗽服务器pipe理在Mac OS X服务器咳嗽 )。 然后在testing服务器上testing它,然后使用无需手动复制文件的文件更新生产服务器就变得非常简单。

几年前我创build了一个项目来完成这个工作: Savon

它使用颠覆来存储文件,并具有一些附加function,如跟踪所有权,权限和SELinux上下文。 它还允许您在逻辑上将文件系统更改分层,因此您可以跟踪应该分别发送到所有Web服务器的更改。

Subversion非常易于安装和使用,并且有很多资源:

基本的方法

SVN书

文档pipe理概述

我们的大多数更改都是通过我们的帮助台系统pipe理的,即使是日常维护types的东西。 我们一直在慢慢地将我们的文档转移到维基上以供我们自己使用,以及我们向最终用户发布的内容。 发布configuration更改及其背后的讨论,很高兴在我们的Intranet上打开。

多年来,我用rcs来开始修改文件,但几年前我开始把整个/ etc放在git控制之下。 它需要一些工作来检查文件的颗粒状大块(有时我诉诸巨大的“各种更新”签入),我已经写了一些脚本来帮助这个,但提到的etckeeper似乎很有趣,我会立即尝试。