![使用 git 来配置多个服务器配置文件](https://linux22.com/image/543566/%E4%BD%BF%E7%94%A8%20git%20%E6%9D%A5%E9%85%8D%E7%BD%AE%E5%A4%9A%E4%B8%AA%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.png)
我们已经将大量源代码迁移到 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 时,我尝试写下主要内容要求对于服务器配置版本控制:
- 我们只想要一个存储库
- 应该能够轻松地将更改推送到中央遥控器
- 变更集应该包含真正的作者
有没有一种好的方法可以将所有配置放在一个存储库中,并且只将子路径作为工作副本?目前我正在考虑两种方法,但想先在这里问这个问题
- 如果.git存储库位于固定位置,例如/var,我们可以从“目标”工作目录链接到子路径。主要问题是:我不知道如何从/ETC到另一个目录以便只导入内容,除了符号链接单个文件
- 我找到了另一种选择这个问题,建议在一个存储库中拥有多个分支。这肯定会增加复杂性,但我可以看到我们尝试这种方式。
在单台机器上使用 git 进行配置文件管理效果很好,但我相信一定有人以我们希望的方式使用它。
谢谢你,
Kariem
答案1
我以前用过类似的东西;它的作用是这样的。
Repo 设置
- 创建一个 git repo,“etc_files”。
- 为每种机器类型创建一个分支,例如“server/www”、“server/dev”等。
- git 支持在分支名称中使用斜线。这可以帮助我在脑海中记住分支的顺序。
- 如果您拥有的机器足够少,那么您可以为每台机器建立一个分支。
- 为每个共享基础设施创建一个分支,例如“modules/apache”、“modules/cups”等等。
- 这些分支用于保存所有机器之间相同的文件,例如
/etc/resolv.conf
。这些就是您现在保存在“svn:externals”存储库中的文件。
- 这些分支用于保存所有机器之间相同的文件,例如
打造一台新机器
- 在新机器上,克隆 git repo 并检查该机器类型的分支。
- 我将其设为只读克隆,以防止人们在未经过测试的情况下从生产机器提交更改。
- 设置一个 cron 作业来
git pull
每天自动执行 repo。
更改机器分支
在单台机器分支中更改代码很简单;只需git checkout
在开发环境中选择适当的分支,进行更改,然后将其提交回中央存储库即可。下次运行 cron 作业时,该分支中的所有机器都会自动获取更改。
更改模块分支
更改模块分支的代码仅稍微棘手一些,因为它涉及两个步骤:
git checkout
适当的模块分支- 进行更改并将其提交至集中服务器。
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)
~$