我有一些耗时的任务,我喜欢将它们分散到多台计算机上。这些任务需要在每台机器上运行相同的 ruby 或 python 脚本(或一系列相互调用的脚本)。这些机器将有一个单独的配置文件,告诉脚本要完成任务的哪一部分。
我想找出在运行这些机器上的脚本之前同步它们的最佳方法。到目前为止,我一直在网络共享上对脚本的副本进行更改,然后在要运行它时将新副本复制到每台机器上。但这很麻烦,而且容易出错(例如,副本上缺少文件或没有单击“复制和替换”)。
让我们假设系统是标准的 Windows 机器,并非专用于此任务,并且我不需要一直运行这些脚本(所以我不想要一个全天候运行且始终保持最新状态的解决方案,我更喜欢根据命令推送/拉取的东西)。
我对各种选择的想法:
- 对我当前的工作流程进行简单调整:将原始文件保留在网络驱动器上,但编写一个批处理文件来复制最新版本的脚本,这样一切都只需单击一下即可完成。需要在每个系统上采取行动,但这并不是世界末日(因为每个系统通常也需要稍微更改其配置文件)。
- 将所有内容放入 Mercurial/Git 存储库,并将新副本拉到每个节点上。直接从每台机器进入存储库将保证获得最新版本(并且还具有允许从任何机器编辑脚本的附带好处)。缺点是它要求在每台机器上安装 VCS,并且由于我不会使用公共存储库,因此处理身份验证可能会有些麻烦。
- 在共享文件夹上打开写权限,并编写脚本以使用 rsync(或类似程序)将更改一次性推送到所有计算机。这样会在每台计算机上获取最新版本(但如果您想省略某台计算机或添加新计算机,则必须更改脚本)。可能的问题是每台计算机都必须允许写权限。
- Dropbox 是一个合理的建议(并且可以很好地工作)但我不想使用外部服务并且我不希望在通常不需要它的系统上全天候运行 Dropbox。
我是不是忽略了什么简单的东西?有没有专门为做这种事情而设计的工具?否则,我倾向于将所有系统都绑定到 Mercurial 中,因为虽然这需要额外的软件,但它比编写批处理文件要强大一些(例如,如果我将脚本的一部分拆分成一个单独的模块,Mercurial 就会知道该做什么,而我必须在批处理文件中添加一行)。
答案1
我使用 Jenkins(CI 服务器)和 Capistrano 2(Ruby 构建/部署)。您不一定需要 Jenkins,但 CI 服务器非常适合这种工作。Capistrano 很棒,因为我可以轻松地完成一件事/多台机器,并且可以根据需要处理从 SCM(git 或 mercurial,如您所问)签出。Fabric(Python)也是一个很好的“部署”框架。
工作流程:
- Capistrano 在本地机器上检出包含脚本的 git 分支/master
- Capistrano 通过 scp 或 sftp 将脚本文件推送到所有机器。(:deploy_via,:copy)
- Capistrano 在所有“应用程序”节点上并行或顺序执行脚本,并报告成功或失败。
您可以用(Fabric|bash|Chrome|chef recipe|puppet config)替代 Capistrano
现在,如果您有一个正在运行的 CI 服务器,您就可以从一个中心点管理 SSH 密钥和管理。
我可以放心地假设您正在使用 Windows 进行本地开发,如果您要部署到的也是 Windows 机器……您可能需要考虑从 Capistrano 运行 Powershell 命令,而不是我在此处概述的“unix”方式。挑战在于 X 如何登录到框 Y 并执行 Z,这是另一个问题。
答案2
只需有一个初始“加载器”脚本,即可从网络获取所有内容的最新版本。将配置数据存储在此树之外(无论如何您都应该这样做)。加载器可以是任何东西,从调用 xcopy/robocopy 的简单批处理文件到 DVCS 拉取或 DropBox/OwnCloud 同步。
这样,无论它如何运行,第一个动作就是在执行之前更新到最新版本。