将git用于多个服务器configuration文件

我们已经将很多源代码迁移到git上,并对我们当前的解决scheme感到非常满意。 我们希望我们的服务器configuration文件在同一个系统上进行版本pipe理,但是有一些事情并不按照我们希望的方式工作,我希望有人可以在这里分享他的经验。

这个问题类似于使用服务器configuration文件的版本控制? ,但是我们有一些特殊的要求,不适用于这个问题的build议。

当前的设置使用颠覆configuration文件。 相应的存储库看起来像这样

  /#存储库的根目录
  +  -  www.domain.com/#www的configuration
  |  \ - 等等/
  |  \  - 的Apache2 /
  dev  -  dev.domain.com/#configuration
  |  +  - 等/
  |  \ - select/
  |  \  -  APP1 /         
  |  \  -  dev上的app1的conf /#configuration
  -  staging.domain.com/#configuration用于分段

有了颠覆,这将工作得很好,因为它可能只是签出存储库的子目录。 另外,你可以使用svn:externals指向一个通用结构来完成几个不同的configuration设置。 我们只需处理所有版本化目录中的.svn文件。 Git另一方面没有svn:外部和稀疏签出始终需要从根目录到实际目录的path相同。

在讨论迁移到git时,我试着写下服务器configuration版本的主要要求

  • 我们只需要一个存储库
  • 应该可以轻松地将改变推向中央遥控器
  • 变更集应该包含真正的作者

是否有一个很好的方法来在一个存储库中拥有所有的configuration,只有一个子path作为工作副本? 目前我正在考虑两种方法,但是首先想在这里提出这个问题

  1. 如果.git库位于一个固定的位置,例如/ var中的某处,我们可以链接到“目标”工作目录的子path。 主要问题:我不知道从/ etc链接到另一个目录的方式,以便只导入内容,除了symlinking单个文件
  2. 我在这个SO问题上find了另一个select,build议在一个存储库中有多个分支。 这肯定会增加复杂性,但我可以看到我们这样做。

在一台机器上使用git进行configuration文件pipe理工作正常,但我相信一定有人按照我们想要的方式使用它。

谢谢
Kariem

我以前用过这样的东西; 这是如何工作的。

回购设置

  1. 创build一个git仓库,“etc_files”。
  2. 为每种机器types创build一个分支,例如“server / www”,“server / dev”等
    • git支持分支名称中的斜杠。 这有助于我保持分支在我的脑海。
    • 如果你有足够的机器,你可以为每台机器分支。
  3. 为每个共享基础设施创build一个分支,例如“modules / apache”,“modules / cups”等。
    • 这些分支用于保存所有机器上相同的文件,如/etc/resolv.conf 。 这些将是你现在在“svn:externals”仓库中保存的文件。

build立一个新的机器

  1. 在一台新机器上,克隆git仓库,并签出该机器types的分支。
    • 我将其设置为只读克隆,以防止人们在未经testing的情况下从生产机器上进行更改。
  2. 设置一个cron作业,以便每天自动地git pull回购。

改变机器分支

更改单个机器分支中的代码很简单, 只需在你的开发环境中git checkout出合适的分支,进行更改,然后将它们提交回中央仓库。 该分支中的所有机器将在下一次运行cron作业时自动获取更改。

更改模块分支

更改模块分支的代码只是稍微有点棘手,因为它涉及两个步骤:

  1. git checkout相应的模块分支
  2. 进行更改并将其提交给中央服务器。
  3. git checkout使用该模块分支的每个机器分支,然后将模块分支合并到其中。 git会发现你已经合并了这个模块分支,并且只注意到自上一个共同父代以来发生的变化。

这种方法既有好处也有弊端。 一个好处是,我可以对模块分支进行更改,并将其应用到需要它的机器分支,从而使机器分支不会与旧版本保持一致,直到准备就绪。 那么缺点是你必须记得把你的模块分支合并到每个可能使用它的机器分支中。 我使用遍历提交树的脚本,并自动为我合并,但仍然是一个痛苦。


作为替代,新版本的git支持“ 子模块 ”:

子模块允许将外部存储库embedded到源树的专用子目录中,始终指向特定的提交。

这样可以让你创build一些像“svn:externals”树一样的东西,然后你可以像现在一样更新它。

这里的一个结点,但它听起来像一个职位接收钩可以完成这项工作

Repo master存储在/ var / master中
该钩子克隆到/ var / localclone
然后复制主机的具体细节
您需要在每台服务器上本地设置.git / post-receive挂钩(使用适当的设置)

这听起来像是你想要一个更像木偶或厨师的东西,而不是git这个,这将允许你运行git来集中pipe理configuration和模块,并让puppet \ chefpipe理你的部署和validation

这是我想到的一个快速工作
1.在/var/repo有一个中央存储库
2.将全局的文件放入该目录中的所有域。
3.为每个子域/var/repo/subdomain1/var/repo/subdomain2等创build分支
4.创build一个邮件钩子,任何推送到分支与主人合并。

所以,当你改变/var/repo/subdomain2configuration时,它会立即与主合并,所以你可以完全拉回购,并拥有所有的configuration文件
当你想拉个人的子域configuration,只要拉适当的分支。

你如何把你的configuration文件到/var/repo/*是完全不同的事情(cron选项卡,我能想到)

〜$