我正在尝试使用傀儡(0.25.5-1.el5) 在安装新的 yum repo 时更新已安装的软件包。
我们的基本映像默认安装了版本 1.1 的软件包 X。在可用的存储库中,版本 1.1 是最新版本。我正在安装一个新存储库,其中有版本 1.8 的软件包 X。我希望新存储库的安装和软件包 X 的更新同时进行。我的代码如下:
class repo {
yumrepo { "foorepo":
descr => 'the foo repo',
baseurl => 'http://path.to.foo/repos/centos/5/',
enabled => 1,
gpgcheck => 0,
}
}
class package_x {
package { "package_x":
provider => "yum",
ensure => "latest",
require => Yumrepo["foorepo"]
}
}
其中节点定义为:
node default {
include repo
include package_x
}
我看到的情况是,当我运行它时第一的此时,puppet 认识到必须安装一个新的 repo,但是由于该包已经在当前 repo 中可用,因此假定 package_x 已经在最新版本如果我运行它第二时间,它就能识别出这个新的 repo 意味着 package_x 必须更新到 1.8 版本。
我已经玩过了通知和订阅参数,但它们似乎不适用于类。似乎 Puppet 正在根据当前设置评估所需的更新,因此必须应用新的 repo,然后它才能“知道”有新版本的 package_x 可用。
我是否缺少解决此类依赖问题的简单方法?是否有人找到允许此类依赖强制更新软件包的设置?
谢谢。
答案1
据我所知,这正是阶段用途——它们允许您对类执行进行分组和排序。我使用“阶段”在 Debian 服务器上更新和配置 APT,这应该与您使用 YUM 执行的操作非常相似。
首先,在顶层(“节点”之上)声明“yum”阶段,以便“yum”阶段中的类将在“主要”阶段之前执行:
stage { 'yum' : before => Stage['main'] }
然后,将阶段分配给类。您可以在节点定义中执行此操作:
node default {
class { 'repo' : stage => yum }
include package_x
}
答案2
您所描述的行为并非我的亲身经历。手动运行 puppet,使用--debug
:
puppetd --debug --test
在此模式下,它将显示其执行的每个命令。它应该显示用于验证包是否为最新版本的命令,以便您可以检查命令是什么以及何时执行。
我没有使用 Yum 处理服务器的经验,但使用 apt-get (Debian) 时,需要运行命令来刷新更新源列表后软件包列表(相当于 yum repos)。因此,在我的配置中,对源列表的更新会通知 exec 软件包列表刷新,而新软件包则依赖于上述(仅刷新)exec。