将 git 用于多个服务器配置文件

Kar*_*iem 17 linux configuration svn git

我们已将大量源代码迁移到 git,并对我们当前的解决方案感到非常满意。我们希望在同一系统上对我们的服务器配置文件进行版本控制,但有一些事情无法按照我们希望的方式工作,我希望有人可以在这里分享他的经验。

这个问题类似于对服务器配置文件使用修订控制?,但我们有一些特殊要求,不适用于有关该问题的建议。

当前设置对配置文件使用 subversion。相应的存储库看起来像这样

 / # 仓库根目录
 +--www.domain.com/ # www 的配置
 | \ - 等等/
 | \--apache2/
 +--dev.domain.com/ # dev 的配置
 | +--等/
 | \ - 选择/
 | \--app1/         
 | \--conf/ # 在 dev 上配置 app1
 \--staging.domain.com/ # 暂存配置

使用 subversion 这将工作得很好,因为可以只检出存储库的子目录。此外,您可以使用 svn:externals 来指向几种不同配置设置的一种通用结构。我们只需要处理所有版本化目录中的.svn文件。另一方面 Git没有 svn:externals并且稀疏检出总是要求从根到实际目录的路径相同。

在讨论迁移到 git 时,我尝试写下服务器配置版本控制的主要要求

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

有没有一种很好的方法可以将所有配置都放在一个存储库中并且只有一个子路径作为工作副本?目前我正在考虑两种方法,但想先在这里问这个问题

  1. 如果.git存储库位于固定位置,例如/var 中的某个位置,我们可以从“目标”工作目录链接到子路径。主要问题:除了符号链接单个文件之外,我不知道有什么方法可以将/etc 中的“链接”到另一个目录以便仅导入内容
  2. 我在这个 SO question上找到了另一种选择,建议在一个存储库中有多个分支。这肯定会增加复杂性,但我可以看到我们尝试这种方式。

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

谢谢
Kariem

Han*_*an5 15

我以前用过这样的东西;这就是它的工作方式。

回购设置

  1. 创建一个 git 存储库,“etc_files”。
  2. 为每种机器类型创建一个分支,例如“server/www”、“server/dev”等。
    • git 支持分支名称中的斜杠。这有助于我在脑海中保持树枝笔直。
    • 如果您的机器数量足够少,您可以为每台机器设置一个分支。
  3. 为每个共享基础设施创建一个分支,例如“modules/apache”、“modules/cups”等。
    • 这些分支用于保存所有机器之间相同的文件,例如/etc/resolv.conf. 这些将是您现在保存在“svn:externals”存储库中的文件。

建造新机器

  1. 在一台新机器上,克隆 git repo 并检查该机器类型的分支。
    • 我将其设为只读克隆,以防止人们在未经测试的情况下从生产机器提交更改。
  2. 设置一个 cron 作业来git pull每天自动执行 repo。

换机分支

在单个机器分支中更改代码很简单;只是git checkout在您的开发环境中的适当分支,进行更改,并将它们提交回中央存储库。该分支中的所有机器将在下次运行 cron 作业时自动获取更改。

更改模块分支

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

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

这种方法既有优点也有缺点。一个好处是我可以对模块分支进行更改并将其应用于需要它的机器分支,这让机器分支在准备好之前不会留在旧版本中。那么,缺点是您必须记住将模块分支合并到可能正在使用它的每个机器分支中。我使用一个遍历提交树并自动为我进行合并的脚本,但仍然很痛苦。


作为替代方案,较新版本的 git 支持称为“子模块”的东西:

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

这将允许您构建有点像“svn:externals”树的东西,然后您可以像现在一样以几乎相同的方式对其进行更新。