傀儡 – 使用确保包'版本'和'举行'

概述:

刚刚开始使用Puppet,并使用下面的“确保”数组,以便安装特定版本的Apache(而不是最新版本)和“持有”(这意味着它不会在标准的apt-get dist-upgrade到最新版本。

问题:

当使用下面的代码时,Puppet只考虑了确保数组中的第一个值。 所以当下面的代码被执行时,它会安装正确版本的Apache,但是这个软件包没有被设置为保存(通过运行dpkg --get-selection进行检查)。

如果数组中的值被交换,那么包被保留,但最新版本被安装。

码:

 package { 'apache2': ensure => [ "2.0.64", held ], } 

欣赏这一个任何指针!
谢谢。

尽我所知,通过阅读源代码,“可保留”function从根本上是有缺陷的。 保证(参见ensurable.do ,第50行)不能接受一系列选项。 因此,一个软件包不能同时安装在一个特定的版本, 并且使用dpkg标记。 我假设parsing器的默认行为是这样的,如果它接收到一个不支持的数组,则使用第一个值。 这将解释你的结果。

在我看来,版本和/或可保留特性应该被重新实现为一个新的variables,例如:

 package { 'apache2' ensure => installed, version => '2.0.64', hold => true, } 

我build议你提交一个错误报告。 在此期间,你可以这样做:

 package { 'apache2': ensure => '2.0.64', } exec { 'hold-apache2-version': command => 'dpkg ...', require => Package['apache2'], } 

我想出了一个解决方法。 振作起来,这是毛病。

 if $::puppetversion == '2.7.11' { $ensure_puppet = 'held' } else { $ensure_puppet = '2.7.11-1puppetlabs1' } package { ['puppet', 'puppet-common']: ensure => $ensure_puppet } 

它使用内置的事实$::puppetversion来进行版本审讯。 所以包的状态将被“保留”,除非安装的版本与我们想要的不同。 这应该使我可以随意升级傀儡基础架构,而不用担心无人照pipe升级。

这并没有回答有关版本lockingApache的确切问题,但是可以简单地写一个自定义事实来查询Apache的版本。

我最初尝试手动dpkg保持方法。 我使用包types来确保版本,然后运行一个执行脚本以确保它是分开保存的。 这与我使用yum版本locking的方法类似。

 define apt::hold() { exec { "hold-${name}": command => "/bin/echo '${name} hold' | /usr/bin/dpkg --set-selections", unless => "/usr/bin/dpkg --get-selections ${name} | /bin/grep hold", require => Package[$name] } } package { ['puppet', 'puppet-common']: ensure => '2.7.11-1puppetlabs1' } apt::hold { ['puppet', 'puppet-common']: } 

现在,这个工作,但它在日志和报告中产生了很多恼人的通知。 软件包的types不能协调一个软件包既可以被保存,也可以保持某个版本。 所以它会通知我软件包状态已经从“持有”变成了“2.7.11-1puppetlabs1”。

 [sanitized.server.name.net] out: info: Retrieving plugin [sanitized.server.name.net] out: info: Loading facts in /var/lib/puppet/lib/facter/operatingsystemmajor.rb [sanitized.server.name.net] out: info: Loading facts in /var/lib/puppet/lib/facter/datacenter.rb [sanitized.server.name.net] out: info: Caching catalog for sanitized.server.name.net [sanitized.server.name.net] out: info: Applying configuration version '1333727048' [sanitized.server.name.net] out: notice: /Stage[main]/Puppet/Package[facter]/ensure: ensure changed 'held' to '1.6.6-1puppetlabs1' [sanitized.server.name.net] out: notice: /Stage[main]/Puppet::Client/Package[puppet-common]/ensure: ensure changed 'held' to '2.7.11-1puppetlabs1' [sanitized.server.name.net] out: notice: /Stage[main]/Puppet::Client/Package[puppet]/ensure: ensure changed 'held' to '2.7.11-1puppetlabs1' [sanitized.server.name.net] out: notice: Finished catalog run in 6.25 seconds 

我不喜欢我的报告一直在哭狼。 这也会导致问题,如果我想要做这样的事情:

 package { ['puppet', 'puppet-common']: ensure => '2.7.11-1puppetlabs1', notify => Service['puppet'] } 

升级后重新启动服务。 我结束了每一次傀儡运行的服务被反弹。

我同意其他所有人的看法,但是“持有”应该是包装types的一个单独属性。

我使用这个puppet模块来pipe理我的系统上的apt。 它提供了一个“preferences_snippet”的定义,可以用来将软件包固定到特定的版本或版本( 请参阅自述文件 )。