我有一个设置,我们希望让 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(或其他一些外部查找工具),这可以让您完全独立于“安装我们的软件”的代码指定所需的软件版本。
如果您想要更进一步,模块可以包含一个事实来指示当前安装的软件版本,这样您的模块就可以禁止诸如版本降级之类的操作(假设这在您的环境中是合适的)。