我正在从 Capistrano 转移到 Chef 以部署 Rails 应用程序(使用deploy_revision),我不清楚最佳实践(或常见实践)的问题。通过谷歌搜索,我没有找到太多东西。
使用 Capistrano 和“推送”模型,在跨多个服务器部署应用程序时,可以直接识别何时出现部署失败并立即在所有服务器上回滚部署。Capistrano 还在每个应用服务器上建立了一个维护页面,然后不会关闭该维护页面,除非我已成功部署到所有服务器或回滚部署。
使用 Chef 和“拉”模型,每台服务器可能会在稍有不同的时间获取其更新。我可能会比应用程序服务器提前几分钟更新应用程序代码并运行数据库迁移。所以我真的没有很好的方法来识别故障并确保构建回滚到最后一个成功部署的版本(在所有服务器上)。
我知道我在这里有一些选择:
- 不要守护厨师客户端。使用 cron 每晚或每小时运行一次。(如果有些服务器成功并且只有一个遇到问题,我仍然无法回滚我的所有服务器。)
- 不要守护厨师客户端。不要使用 deploy_revision。通过knife ssh或capistrano-chef运行它。(我现在回到“推”模型而不是“拉”模型,这是 Chef 吸引力的一部分。)
- 守护厨师客户并编写相互交谈的自定义食谱。(对此不感兴趣。)
- 放松。别担心。让错误发生,然后修复它们。(这里也不激动。)
我可以开始构建其中任何一个,但在我投入大量时间构建之前,我希望了解在该领域的大型部署中什么是有效的。你做了什么?