使用 Puppet 管理第三方/定制软件的最佳方法是什么?

使用 Puppet 管理第三方/定制软件的最佳方法是什么?

我们使用的 Ruby、Collectd、Ant、Java(以及更多)版本在 CentOS 或 EPEL 存储库中不可用。到目前为止,我们安装这些的策略有点儿像 hack:

  • 为每个包编写一个(版本控制的)脚本,使用 curl 从主机站点下载源代码或二进制文件到 Puppet master 上,并在必要时编译源代码;必要时重新打包成 gzip 压缩包

  • 使用 Puppet 文件服务器将二进制文件分发到我们的服务器,并使用 Puppet 清单将 tarball 解压到 /usr/local (或任何地方)

编写脚本可能很麻烦,如果我们依赖的某个下载站点更改了 API,就必须更新脚本。此外,软件在每个环境中都是单独编译的,这似乎很浪费,并且可能会导致缺少编译时依赖项的问题(例如,Ruby:require 'readline' 或 require 'yaml' 可能在某些环境中有效,但在其他环境中无效)

因此,我可以想到另外两个选择:

  • 只需将定制的第三方二进制文件签入 Subversion,然后将其与其余的 Puppet 代码一起分发即可。我担心这会严重影响签出和 Puppet 代码推送的性能;我们正在查看近 800MB(并且还在增长)的第三方代码。此外,将 Java 的多个版本和架构并排签入版本控制中感觉不太对劲。

  • 不要对二进制文件进行版本控制或编写下载脚本——当我们决定升级 Ruby 时,在开发机上编译它,并在决定升级时手动将新包上传到我们所有的 Puppet 主服务器。但如果包被删除了怎么办?或者在不同的主服务器上不同步怎么办?现在我们可以轻松地从头开始重新生成所有自定义包。

这三个选项哪个更好?人们通常如何使用 Puppet 管理自定义编译/重新打包的第三方软件?如果您创建本地 Yum 存储库,您是否对用于创建 RPM 的过程进行版本控制?如果您的 Yum 存储库被清除,会发生什么情况?

答案1

Puppet 并非真正设计用于分发大型文件,因此您最好在带外执行此操作。最好的方法是将自定义/第三方软件打包为 RPM 并托管您自己的 RPM 存储库。RPM 打包(即 specfile 和补丁)最好进行版本控制,并且 RPM 存储库应备份或托管在多台计算机上。

答案2

我强烈建议使用 Yum 存储库来部署所有软件,包括您编译的软件。正确配置后,您将理清所有依赖关系问题、版本控制等。

我倾向于为我的存储库设置三个分支系统 (dev、qa、prod)。这样可以将给定的系统添加到不同的存储库并相应地运行。

我通过 Puppet 来完成这个任务(以及安排 yum 更新)。

答案3

呼应另外两个答案:使用发行版的现有包管理系统。

我们在 Ubuntu 上执行此操作并apt安装 RabbitMQ 和 OAuth,如下所示:

class apt::example {

  file  {  "/etc/apt/sources.list.d/repo.example.list":
    source => "puppet:///modules/apt/repo.example.list",
    ensure => present,
  }

  exec {"install-gpg-key":
    command => "/usr/bin/curl -s http://repo.example.com/[email protected] | /usr/bin/apt-key add -; /usr/bin/apt-get update",
    refreshonly => true,
    subscribe => File["/etc/apt/sources.list.d/repo.example.list"],
    require => File["/etc/apt/sources.list.d/repo.example.list"],
  }

}

并使用 repo:

class apache2::platform {

  package { ["librabbitmq0", "php5-amqp", "php5-oauth"]:
    ensure => installed,
    notify => Service["apache2"],
    require => File["/etc/apt/sources.list.d/repo.example.list"]
  }

  [...]

}

在我们尝试从中安装任何东西之前,这里require要确保已经添加了 repo。

可能有更好的方法来处理添加 GPG 密钥并运行和更新,因为这个命令返回一个肯定的退出代码,这导致 puppet 认为它失败了,但由于它作品我没有花费太多精力去修复虚假的错误信息。

我没有尝试将 repo 配置添加到 puppet 或自动构建并添加到新包的 repo 流程,但一旦达到一定规模,这些任务就会变得有价值。备份总是值得的。

RPM和的过程yum应该非常相似。

相关内容