![使用 Puppet 部署我们自己的软件?](https://linux22.com/image/533983/%E4%BD%BF%E7%94%A8%20Puppet%20%E9%83%A8%E7%BD%B2%E6%88%91%E4%BB%AC%E8%87%AA%E5%B7%B1%E7%9A%84%E8%BD%AF%E4%BB%B6%EF%BC%9F.png)
(提前为这个问题的愚蠢道歉。我通常是一名程序员,而不是系统管理员,但我已将一些事情自动化,并清理了一些虽然自动化了但方式不是最漂亮的事情。:-)
我一直在寻找各种用于自动将软件部署到一组服务器的工具,比如 cfengine、Puppet 和 Chef。到目前为止,Puppet 看起来最有吸引力,但我还没有决定使用什么。
这些工具看起来都能很好地保持一堆服务器的更新预先包装软件。
我不明白的是:如何使用工具(如 Puppet)来管理我们自己的内部软件的部署?我想我很困惑,因为我已经看过一千个教程,教你如何保持 Apache ensure => latest
(它是很酷),但没有一个与我今天的用例完全对应,这更像是:
- 当人类按下按钮时,
- 从版本控制存储库 B 中拉取分支 A
- 运行命令 C 来编译它
- 将二进制文件 D 复制到服务器 E1 至 E10
- 在每台服务器上,运行命令 F 以使所有更改生效
Puppet 听起来很棒,我完全明白声明式、幂等配置相对于某些 shell 脚本的优势,但我还没有看到任何关于“您想将 shell 脚本更新为 Puppet(或 Chef 或 cfengine),那么您应该这样做”的教程。有这样的事吗?其他人是否清楚如何利用 Puppet 文档中提供的内容并复制我想要的行为?我只是不明白吗?
到目前为止,在我看来,情况是这样的:人类(#1)会手动将软件(#2 和 #3)打包到 Puppet 外部,手动更新 Puppet 配置,这会触发 Puppet 来更新服务器...也许?(我在这里有点困惑,我相信您一定看得出来。)
谢谢!
答案1
我们使用 puppet,但我们不将其用于应用程序部署。正如您所说,您可以将软件打包成 debs 或 rpm,在任何地方配置您的私有存储库,并使用 puppet 来控制版本,但您仍然需要等待所有服务器的下一个 30 分钟刷新。
我会做什么(这与我们做的很接近,但我们使用 rails 所以没有编译步骤):
- 使用 puppet 配置服务器上除应用程序本身之外的所有内容。依赖项、Web 服务器、用户、路径等。
- 让您的自动构建服务器(bamboo、hudson、cruise control 等)将编译后的工件放入 Nexus 之类的存储库管理器中。
- 使用 capistrano 将构建推送至您的服务器。
Chef 可能具有更多的实时推送功能;我对此不太熟悉。
答案2
步骤 1 到 3 通常在构建过程中自动执行。通常,此过程的输出将经过测试周期。我将输出打包,以便将其部署到集成测试环境中。只有集成测试通过,才会执行步骤 4 和 5。
您的步骤 5 暗示部署中断。对于像 apache 这样的程序,可以通过在日志轮换期间关闭并重新启动来处理。crontab 脚本可以处理这个问题。如果您可以在一小时左右的时间内处理滚动更改,只需在部署步骤 4 中包含重新启动即可。Puppet 或 cfengine 是适合步骤 4 的工具。这可以通过在集成测试通过时更新存储库来触发。
答案3
搜索 puppet 配方,你会发现大量可用于生产的脚本。是的,你必须手动打包软件。如果你维护自己的个人存储库,那么你可以使用 Ensure=>latest 标志。然后编写一个配方来告诉 puppet 安装软件。配方需要放在主服务器上,然后从那里传播到从属服务器。