如何管理具有不同模块版本的 Puppet 节点?

如何管理具有不同模块版本的 Puppet 节点?

我有一个设置,我们希望让 puppet 管理我们软件在多个服务器上的安装和配置,但能够在不同的服务器上安装不同版本的软件。

例如,我希望能够创建一个 puppet 模块,其中包含版本 1.0 的服务器配置、依赖项等,以及一个单独的版本 1.1。从单个 puppet master 安装中,我希望能够配置一些节点运行版本 1.0,其他节点运行 1.1。

我看到模块允许包含版本的元数据,但看起来你一次只能在 Puppet Master 上安装一个版本的模块。

理想情况下,它将基于组,我们可以定义“早期采用者”组和“普通”组,并且当我们提出新版本时,我们可以设置早期采用者组使用新版本,而普通组使用下一个最旧的版本。

解决此问题的最佳方法是什么?

答案1

我最喜欢的方法有以下三种:

  • 为了从 apache1 迁移到 apache2,我们创建了完全独立的模块。您可能认为这会导致大量重复,但我们同时重新进行了配置。
  • 对于单个软件包的简单升级,我们会执行以下操作

    package{"foo":
        ensure => $wants_foo_upgrade ? {
            true => latest,
            false => 1.0
        }
    }
    

    其中$wants_foo_upgrade基于我们的基础架构数据库、extlookup 数据或事实

  • 对于中间的情况,我们采用第二种方法,并使用该变量来确定要使用哪个配置文件,或者在配置文件的模板中使用。

答案2

我建议通过使用一个以版本号作为参数的模块来实现这一点,如下所示:

class our_software ($version) {
  ...
}

您在该类中执行的操作取决于软件的两个版本的共同点。您可能能够将所有配置文件直接包含在类中,并使用模板根据版本号为其设置选择正确的值,或者您可能有两个单独的类,每个版本的环境设置完全不同,主类根据版本号决定包含哪些。

如果您正在使用 hiera(或其他一些外部查找工具),这可以让您完全独立于“安装我们的软件”的代码指定所需的软件版本。

如果您想要更进一步,模块可以包含一个事实来指示当前安装的软件版本,这样您的模块就可以禁止诸如版本降级之类的操作(假设这在您的环境中是合适的)。

相关内容