使用 git 来配置多个服务器配置文件

使用 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. 我找到了另一种选择这个问题,建议在一个存储库中拥有多个分支。这肯定会增加复杂性,但我可以看到我们尝试这种方式。

在单台机器上使用 git 进行配置文件管理效果很好,但我相信一定有人以我们希望的方式使用它。

谢谢你,
Kariem

答案1

我以前用过类似的东西;它的作用是这样的。

Repo 设置

  1. 创建一个 git repo,“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”树的东西,然后您可以按照与现在相同的方式更新它。

答案2

虽然有点儿困难,但听起来一个接收后挂钩可以完成这个工作

Repo master 存储在 /var/master 中,
钩子将其克隆到 /var/localclone,
然后复制出主机特定的详细信息
您需要在每台服务器上本地设置 .git/post-receive 钩子(使用适当的设置)

听起来你想要的更像是 puppet 或 chef 而不是 git,这将允许你运行 git 来集中管理配置和模块,并让 puppet\chef 为你管理部署和验证

答案3

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

因此,当您更改配置时,/var/repo/subdomain2它会立即与主配置合并,以便您可以完全拉取 repo 并拥有所有配置文件。
当您想要拉取单个子域配置时,只需拉取相应的分支即可。

如何将配置文件放入/var/repo/*完全不同的事情中(我能想到的 cron tabs)

~$

相关内容