![chef 和具有长期运行构建的软件包](https://linux22.com/image/581877/chef%20%E5%92%8C%E5%85%B7%E6%9C%89%E9%95%BF%E6%9C%9F%E8%BF%90%E8%A1%8C%E6%9E%84%E5%BB%BA%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85.png)
我正在尝试使用 chef,并将我的服务器配置移至它。我遇到的一个障碍是如何处理必须手动编译和安装的软件包(configure、make、make install),但编译过程却需要很长时间。我不想因为依赖项需要很长时间才能构建而阻碍服务器启动时间。
具体用例:wkhtmltopdf。具有完整功能的 Wkhtmltopdf 需要自定义/修补的 qt,需要很长时间才能编译。
以下是我的选择:1) 每次启动时使用 chef 编译软件包(缺点:启动服务器需要很长时间)2) 编译软件包一次,然后打包并上传。然后下载软件包并安装。(缺点:不适用于具有不同操作系统/硬件的机器)3) 编译软件包一次,然后将其保存在基础映像中,而不是 chef 中(Chef:软件包不在 chef 中)
有任何想法吗?
答案1
虽然许多共享的 Chef 手册都是从源代码构建的,但这并不一定是在系统上安装软件的最佳途径。它通常表示“最简单的东西可能有效(但未优化)”,或“(手册)作者没有时间/资源来维护软件包的公共存储库。”
“常见做法”(*) 是为您的平台构建和安装本机软件包,并将它们托管在内部存储库中。如果您在一家乐于分享的公司工作,那么将这些软件包贡献给上游或使用公开托管的存储库(如 Ubuntu PPA)也是一种选择。
这种方法的问题在于,每个主要发行版对软件包管理都有不同的看法,因此所有方法都略有不同。这就是Jordan Sissel 的“fpm”非常方便。虽然它目前仅适用于 RPM、DEB 和 Solaris,但对其他打包系统的支持计划。你可以进一步将 fpm 挂接到持续集成服务器中,例如詹金斯通过在 Jenkins 中的构建步骤中调用所需的 fpm 命令。
构建要部署的软件包后,您需要将它们放入存储库中。如果您无法通过 PPA 公开分享,那么我建议使用 Chef 构建软件包存储库主机。如果您使用的是 Debian/Ubuntu,复制版对于创建 apt 存储库来说,mrepo 是常见的。对于 RPM/Yum,mrepo 是常见的,尽管我不知道有哪本手册可以设置它。然后你可以使用易于或者好吃cookbooks 在其他节点上设置存储库。
另一种可能更简单的方法是构建软件,将其打包并粘贴到节点可以访问的 HTTP 服务器上,然后使用 Bryan Berry 的方舟用于检索和解压它的食谱资源。
(*)我说普通是因为我鄙视这里的“最好”:)
答案2
对于 chef/puppet 等,正确的方法是自己将该软件打包到您的发行版的本机打包格式中,然后将其包含在您的存储库中,然后拉取该包。