我正在寻找最好的方法(用于我的目的和情况)来对系统configuration文件进行版本pipe理,并且在两台机器(活动和备份,都应该被视为'生产')之间pipe理部署(所有权和模式)。 我希望能够使用此系统自动(但有select地)复制和pipe理备份机器(EC2实例)上的相关和指定的configuration。
目前,这些机器主要是networking和SMTP服务器(我们不存储用户邮箱),但是我们的项目正在增长,谁知道未来的需求可能会是什么。 例如,我们有可能在未来某个时候实施无线电和基于networking的聊天。
我更喜欢按照惯例pipe理服务器(即根据需要进入并对现场服务器进行更改),然后将这些更改(一旦安置)存储在pipe理系统中。 (好吧,如果我是诚实的,我应该有机地说:我不想失去灵活性来做需求和情况需求的东西。)我find了这种方法,而不是部署在其他地方进行调整和testing的configuration,更具可预测性,而且可能会带来更less的惊喜(除了在现场系统上搞乱configuration的可能性之外,就是!)
我从哲学的angular度认识到,这是回到前面,如果我有资源(testing基础,更重要的是人力),我可能会反过来做。 事实上,我必须要做我所做的。 我非常喜欢结构,但是过多的基础设施本身就是一种生活,在某种程度上它的价值已经丧失。
我已经做了一些家庭作业,并回顾了几个选项,但他们都没有真正做我想要他们,所以我目前试图推出我自己的解决scheme。 这个问题的目的是为了看看我没有想到的,并在我吠错了树之前进行理智检查。
像Puppet这样的声明性元configuration系统可能是很好的select,因为许多服务器在这些服务器之间很less或根本没有区别,特别是在提前清楚configuration应该是什么样的情况下。 我不认为在没有基础架构的情况下使用这样的工具是明智的。
这也有点沉重,过于复杂。 我是唯一的pipe理者,我在业余时间做这个事情,如果我留下来的事情发生在我身上,对于那个走在我身后的幸运男人/女孩,我们应该是合理的。
etckeeper可能会这样做,但据我所知,它并不适用于除/ etc以外的任何其他pipe理。 也就是说,它不适合存储自定义脚本,这些自定义脚本通常位于/ usr / local / bin中。 此外,etckeeper大概pipe理所有 / etc,我认为我宁愿只版本特定的东西(如后缀,Apache,fail2ban,SSH和可能munin)。
一个简单的git或svn回购肯定不会,因为当git跟踪权限时,它不会跟踪所有权,并且svn也不跟踪。
svn在每个被跟踪的目录中保存一个.svn子目录,而.git仅存在于工作副本的根目录中。 这两种情况都有好处和坏处。 在某些地方存在一个.svn目录可能在某些地方是可以的(例如/ etc / apache2 / sites-enabled),但在其他地方打乱了大脑死亡的脚本/工具。 (我确定我读了一些东西:cron是否可以在/etc/cron.d中使用.svn目录,但是depmod不是使用/ lib / modules?)
另一方面,在/ .git中,git认为所有的事情都是跟踪的候选者,甚至(大概)其他git回购!
这是我打算做的:在主机上存储的一个颠覆回购(比如/ usr / local / sc-repo)和一个用Pysvn写的pipe理脚本,它实现了以下function:
添加(但默认情况下,不recursion),将文件的模式和owership存储为自定义属性。 另外,我喜欢在我的configuration文件$Id$标签,所以这将确保svn:keywords设置正确。
承诺
更新,写入文件后应用所有权和模式
还原,同上
烫发,像差异,但所有权和模式,修复标志如果需要更正。
备份机器将通过ssh访问repo并每晚执行一次更新操作。 (它也会做其他事情,比如从主机的备份仓库(S3)恢复站点SQL和应用程序文件系统,我可能不得不写一些黑客来寻找在主机上添加的新软件包,并将它们添加到备份机器 – 但是这个问题的范围之外。)
为什么颠覆?
我知道,比我更熟悉svn而不是使用git。 是的,我可能是恐龙。
Pysvn很简单,我以前用过。
svn支持版本化的自定义属性,其中git似乎不是
这不是分布式开发:分布式回购使事情变得复杂而没有利益。 远程回购可用性是无关的,因为从远程机器提交将是罕见的。
我会很感激你的反馈。 我尽可能多地思考了这一点,但是我一定会错过一些东西。
不要重新发明轮子。 这些工具可以满足你的需求。 你可能想看看bcfg2 ,特别是因为你似乎特别关注configuration文件。 也想想服务。 中央资料库在哪里与生产服务器相关?
也许中间选项可能是蓝图工具输出的巧妙修改。 我使用Blueprint对现有系统进行逆向工程。 Blueprint运行的输出可以创buildshell脚本,Puppet模块或Chef Cookbook …一旦您在生产服务器上拥有经过validation的configuration,就可以使用此工具来捕获系统的状态,然后对结果进行标记和版本化。 如果这看起来适合您的使用案例,请阅读示例并报告。
像Puppet这样的声明性元configuration系统可能是很好的select,因为许多服务器只涉及很less或根本没有区分,特别是在提前清楚configuration应该是什么样的情况下。 我不认为在没有基础架构的情况下使用这样的工具是明智的。
即使对于单机设置,我也使用Puppet(但是,是的,厨师,Ansible和Salt等)。 我还没有遇到任何人提前清楚机器configuration应该是什么样子的情况(可以说,许多configuration应该看起来不是很清楚,但这完全是另外一个问题)
至于“升级基础设施”,那就是Vagrant和VirtualBox (或其他一些支持虚拟化技术) – 在开发机器上运行它,以实现零花费。 没有它,我不会做任何Puppet清单的开发。 还用Travis CI进行自动化testing
这也有点沉重,过于复杂。 我是唯一的pipe理者,我在业余时间做这个事情,如果我留下来的事情发生在我身上,对于那个走在我身后的幸运男人/女孩,我们应该是合理的。
说出这个看起来并不一致,然后描述你是如何计划一个本土化的解决scheme,而不是现有的大量的文档,例子,现有的“图书馆”和积极的发展的解决scheme。