pipe理/版本化主机特定的脚本(* nix)

目前我们正在使用Puppet(在SVN中有清单和相关文件)来pipe理我们的* nix主机的configuration。 不过,我碰到了一个令人困惑的问题。

我们的许多主机都具有特定于主机的脚本 – cron作业,数据挖掘脚本,dynamic生成configuration文件的脚本等。我正在寻找一种方法来pipe理这些脚本,特别是对它们进行版本化,并允许一个相对简单的恢复解决schemeif主机重build,而不改变现有的布局。

我似乎无法find对我们的环境“有效”的解决scheme。

  • 我们在文件系统的任意位置都有脚本。 特别是考虑到这些应用程序中的某些应用程序的年龄,移动位置不是一种select
  • 大多数开发人员都有一个就地编辑工作stream程。 这是不可能改变的。
  • SVN没有解引用符号链接的方法,所以我不能只创build一个链接到脚本和版本的目录。
  • 开发人员无法访问Puppet回购。 这需要在现有的文件系统权限内工作,即用户只能修改他们有权访问的脚本,而不能修改其他脚本。

我想最简单的方法来解释我在找什么是我想要但不存在:

  • SVN处理符号链接(即符号链接所有configuration到一个目录,然后正常工作,并让他们版本)
  • SVNpipe理主机上给定的path或目录列表的一个简单方法,但保持不变。

有什么build议么?

这里真正的问题不在于SCM系统,而在于您无法控制用户在生产环境中进行不受控制的更改。 除非让用户检查更改,否则configuration控制并不是真正的正确方法。 这听起来像你真的需要一个好的备份解决scheme,你可以用它来快速恢复工作映像。

如果你想能够用puppet恢复“configuration”,而不是传统的备份解决scheme(你应该有的话),你可能想看看使用Jordan Sissel的fpm http://www.semicomplete.com/blog /geekery/fpm.html 。 fpm实际上是用来生成软件包(rpm,deb等),但是它可以输出一个给定文件列表的puppet模块。 你可以在每台主机上运行一个cronjob,并用该主机脚本生成一个puppet模块,并将其检入到svn / git / etc中。

FSVS是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回购。

我还build议添加一个每日cronjob在/做一个自动提交。

你还必须排除很多文件,caching,临时目录等等,否则你会用垃圾填满你的仓库。

我build议直接在服务器上更新版本控制库。 我将大部分生产configuration保留在基础架构存储库上。

这听起来像是你试图过度devise解决scheme。 不要使用符号链接,让他们在任意位置使用SVN。

虽然有SCM可以存储链接,但我不知道任何SCM系统都以这种方式处理链接。 他们也不应该恕我直言! 如果你想同时在两个不同的分支上工作,并检出两份,每个分支一份? (这在我编程项目的经验中是相当普遍的。)如果每个指向磁盘上其他地方的相同文件,它们就会造成混乱。

SCM通常会留下属于他们的目录。 这允许多个签出的回购站并排地生活而不受干扰,并且使SCMpipe理的文件和非SCMpipe理的文件之间的界限变得清晰。

我将build立一个围绕复制和显式部署操作的解决scheme,而不是链接。 为了处理您的情况,我会在脚本的部署位置和SCMpipe理的源目录(我将称之为“repo”)之间编写同步脚本,以便您可以吸收脚本的原位编辑进入回购。 我也将使用一个简单的运行部署脚本(基于Puppet的),从回购站复制到目标位置进行testing。

虽然我同意重新训练开发人员在Subversion中进行编辑可能会更好,但是您可以在不付出太多努力的情况下对其进行合理的修改。

我首先创build一个目录或存储库(取决于你的环境中最有意义的东西),每个主机都有一个子目录,你希望这样pipe理。 在这些目录下面,以结构化的方式放置你想要pipe理的文件。 就我个人而言,我会这样做:

 per_host_confs /
    主机1 /
        等等/
             cron.d /
                 FOO
             logrotate.d /
                酒吧
         VAR /
             ...

然后添加一个cronjob(或者添加一个puppet规则),运行一个脚本来检查当前主机目录的主干($ hostnamevariables在你的木偶配方中会有帮助)到一些临时目录,find一个目录并将相关文件复制到工作副本中,然后提交。

重新部署它的puppet规则可以做类似的事情,并使用创build或检查修改时间来确定何时将工作副本/ repo中的文件推送到本地磁盘上。

你可以用另一种方式来做符号链接吗? 有一个由svnpipe理的目录(比如/usr/local/scripts/ ),然后将所有脚本复制到该目录(或子目录)中,并在旧位置中放置一个符号链接。 然后,每当有人编辑文件,他们实际上编辑svn目录中的文件。

如果sym链接不能这样工作,那么你可以使用硬链接。

一旦你完成了,你可以尝试和鼓励你的员工在新的地方编辑文件,并逐渐标准化新的目录结构。 作为一个后盾,你可以有一个cron工作,每天晚上做一个检查,并发邮件给你,让你知道谁不使用新系统,所以你可以友好的提醒相关人员。