我们目前正在使用 Puppet(使用 SVN 中的清单和相关文件)来管理 *nix 主机的配置。但是,我遇到了一个令人困惑的问题。
我们的许多主机都有特定于主机的脚本 - cron 作业、数据挖掘脚本、动态生成配置文件的脚本等。我正在寻找一种方法来管理这些脚本,特别是对它们进行版本控制,并在重建主机时允许相对简单的恢复解决方案,同时不改变现有布局。
我似乎找不到适合我们的环境的解决方案。
- 我们在文件系统的任意位置都有脚本。尤其是考虑到其中一些应用程序的年代久远,移动位置不是一个选择。
- 大多数开发人员都有就地编辑的工作流程。这不太可能改变。
- SVN 没有办法取消引用符号链接,所以我不能只创建一个包含指向脚本和版本的链接的目录。
- 开发人员无权访问 Puppet 存储库。这需要在现有文件系统权限内进行 - 即用户只能修改他们有权访问的脚本,而不能修改其他内容。
我想,解释我所寻找的东西的最简单的方法是我想要但不存在的东西:
- 处理符号链接的 SVN(即将所有配置符号链接到一个目录,然后正常工作并对其进行版本控制)
- SVN 可以轻松管理主机上给定的路径或目录列表,但其他所有内容保持不变。
有什么建议么?
答案1
这里真正的问题不是 SCM 系统,而是你无法控制用户在生产环境中进行不受控制的更改。除非你能让你的用户签入更改,否则配置控制并不是真正正确的方法。听起来你真正需要一个好的备份解决方案,你可以使用它来快速恢复工作映像。
如果您希望能够使用 puppet 恢复“配置”,而不是使用传统的备份解决方案(无论如何您都应该拥有),您可能需要考虑使用 Jordan Sissel 的 fpmhttp://www.semicomplete.com/blog/geekery/fpm.html。fpm 实际上是用于生成软件包(rpm、deb 等)的,但它可以根据文件列表输出 puppet 模块。您可以在每台主机上运行 cronjob,使用托管脚本生成 puppet 模块并将其签入 svn/git/etc。
答案2
弗朗西斯·斯图尔特是 Unix 的 Subversion 客户端,允许您使用文件系统的任何部分作为工作副本。它将 SVN 数据存储在 /var 下,因此不会在您的目录中散布 .svn 子文件夹。重要的是,它将 Unix 文件元数据透明地存储在 SVN 属性中。
它的使用方式与在命令行上使用 svn 类似:
cd /home/mydir
fsvs urls svn+ssh://yoursvnrepohost/var/svn/yourrepo/home/mydir
fsvs exclude ./tmp
fsvs commit -m 'initial commit'
(...)
fsvs log
fsvs diff thatconfigfile
您可以使用任何 SVN 工具来浏览生成的 SVN 仓库。
我还建议添加每日 cronjob 来在 / 执行自动提交。
您还必须排除许多文件、缓存、临时目录等,否则您的存储库将会被垃圾填满。
答案3
我建议直接在服务器上更新修订控制存储库。我将大部分生产配置保存在基础设施存储库中。
听起来你正试图过度设计解决方案。不要使用符号链接,让他们在任意位置使用 SVN。
答案4
虽然我同意最好重新培训你的开发人员在 Subversion 中进行编辑,但你可以毫不费力地对此进行合理的破解。
我首先会创建一个目录或存储库(取决于您的环境中最合理的情况),其中包含您希望以这种方式管理的每个主机的子目录。在这些目录下,以结构化的方式放置您希望管理的文件。就我个人而言,我会这样做:
per_host_confs/ 主机1/ ETC/ cron.d/ 富 logrotate.d/ 酒吧 无功/ ...
然后添加一个 cronjob(或添加一个 puppet 规则),运行一个脚本,将相应主机目录的当前主干($hostname 变量在您的 puppet 配方中会很有用)检出到某个临时目录,在该目录上执行查找并将相关文件复制到工作副本中,然后提交它。
重新部署它的傀儡规则可以做类似的事情,并使用创建或检查修改时间来确定何时将文件从工作副本/存储库推送到本地磁盘。