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


14

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

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

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

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

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

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

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

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

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

在单台机器上使用git进行配置文件管理可以正常工作,但是我相信一定有人在使用它,就像我们希望使用它那样。

谢谢你
Kariem

Answers:


14

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

回购设置

  1. 创建一个git仓库,“ etc_files”。
  2. 为每种机器类型创建一个分支,例如“ server / www”,“ server / dev”等。
    • git在分支名称中支持斜杠。这有助于我将树枝伸直在脑海中。
    • 如果计算机数量少,则可以为每个单独的计算机创建一个分支。
  3. 为每个共享基础架构创建一个分支,例如“模块/ apache”,“模块/杯”等。
    • 这些分支用于保存所有计算机之间相同的文件,例如/etc/resolv.conf。这些就是您现在保存在“ svn:externals”存储库中的文件。

建造新机器

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

更换机器分支

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

更改模块分支

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

  1. git checkout 适当的模块分支
  2. 进行更改并将它们提交到集中式服务器。
  3. git checkout使用该模块分支的每个机器分支,然后将模块分支合并到其中。git会弄清楚您之前已经合并了该模块分支,并且仅注意到自最后一个公共父代以来发生的更改。

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


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

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

这将使您可以构建一些类似于“ svn:externals”的树,然后可以按照与现在相同的方式进行更新。


这是我在问题中建议的备选方案2的非常详细的阐述。大!但是,如果/由于写入权限而必须进入存储库根目录,则很难实现第二个要求(将更改推回)。
卡里姆(Kariem)2011年

您的意思是对/ etc的写权限吗?还是能够提交到存储库?恐怕我不明白问题的根源。
Handyman5

@ Handyman5: On a new machine, clone the git repo and check out the branch for that machine type。我是否可以使其他分支无法访问(出于安全原因)?
尤金·雅玛什

您可以使用类似的方法将git仓库的内容导出到计算机。然后,每台计算机上都没有存储库,只有分支中的文件。但是,如果要将变更集从每台计算机推送到中央远程服务器,我知道没有一个解决方案既有单个存储库,也没有允许您在各个分支上设置访问控制的解决方案。也许您可以在仓库上使用.htaccess在http上进行Subversion?我不知道那行不通。
Handyman5

@ Handyman5:看来,颠覆实际上是完成任务的正确工具。谢谢你的帮助。
尤金·雅玛什

1

这里有点小问题,但听起来像一个帖子接收挂钩可以完成这项工作

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

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


1

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

因此,当您更改/var/repo/subdomain2它的配置时,它会立即与master合并,这样您就可以完全提取存储库并拥有所有配置文件。
当您要提取单个子域配置时,只需提取相应的分支即可。

您如何将配置文件放入/var/repo/*完全不同的事情(我可以​​想到cron选项卡)

〜$

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.