我想使用 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-versionlock
yum 插件将特定的 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。