我可以使用通配符来确保 Puppet 包涵盖多个发布版本吗

我可以使用通配符来确保 Puppet 包涵盖多个发布版本吗

我想使用 puppet 以受控方式更新我的 (CentOS 5 & 6 服务器) 上的软件包。因此我不想使用ensure=>latest而是使用ensure=>3.0.1-1

例子:

class puppet::installation inherits puppet {
        package { "puppet":
            ensure => "3.0.1-1",
        }
}

更新工作正常,但 Puppet Agent 一直抱怨存在差异:

/Stage[main]/Puppet::Installation/Package[puppet]/ensure: current_value 3.0.1-1.el6, should be 3.0.1-1 (noop)

我可以通过将确保规则更改为来解决这个问题,3.0.1-1.el6但这在 CentOS 5 上不起作用。

有没有一个简短/干净的方法来解决这个问题,或者我必须编写单独的、依赖于 os-releaseversion 的规则。

我一直在谷歌寻找解决方案,但没有找到与这个特定问题相关的任何内容。

任何建议或相关示例的引用都将受到赞赏。

答案1

您必须用 case 语句设置一个变量,如下所示:

class puppet::installation inherits puppet {

        case $::operatingsystemrelease {
            '5':     { $puppet_ver = '3.0.1-1'}
            default: { $puppet_ver = '3.0.1-1.el6'}
        }

        package { 'puppet':
            ensure => $puppet_ver,
        }
}

但是,对于这种逻辑,使用 params.pp 文件是一种更好的设计。在此处阅读有关 params.pp 的信息:http://www.example42.com/?q=understandExample42PuppetModules

答案2

Puppet 目前实际上还不具备这样的功能(尽管他们确实需要它)。

您可以使用yum-versionlockyum 插件将特定的 RPM 包锁定在特定的版本,然后使用 puppet 来控制 versionlock 配置。

有关其他解决方法,请参阅这个相关问题

答案3

实际上,我可以使用通配符来安装特定版本的 Python,而不管操作系统是什么。我的 Python 软件包代码如下。

package {
    "python-dev": ensure => "2.7.3*";
    "python-setuptools": ensure => installed;
    "python-pip": ensure => installed;
    "libxml2-dev": ensure => installed;
    "libxslt-dev": ensure => installed;
}

通过使用 2.7.3* 作为确保版本,它在我的 vagrant VM 上安装了 python 2.7.3-0ubuntu2.2。我正在使用 Puppet 版本 2.7.19。

相关内容