有没有办法强制 puppet 首先做某些事情?例如,我需要它在所有服务器上安装 RPM 以添加 yum 存储库(IUS 社区),然后再安装任何软件包。
答案1
如果你想确保在你的所有服务器上都安装了存储库,那么我建议这样做
node default {
include base
}
class base {
yumrepo { "IUS":
baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
descr => "IUS Community repository",
enabled => 1,
gpgcheck => 0
}
}
然后,对于任何延伸的节点,base
你可以说
class foo {
package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}
这将确保
bar
除非定义了 IUS 存储库,否则不会安装该包- 在定义 IUS 存储库之前,不会尝试安装该程序包
答案2
尽管阶段可以处理这个问题,特定的 yum repo 依赖项也可以处理这个问题,但更好的方法是通用地声明这种关系。
只需 Yumrepo <| |> -> Package <| provider != 'rpm' |>
输入你的傀儡清单即可。
node default {
Yumrepo <| |> -> Package <| provider != 'rpm' |>
}
这样,所有 yumrepo 类型都会在未以“rpm”作为提供程序的任何包之前得到处理。后者排除是为了让我能够使用(例如)epel-release RPM 包来帮助安装 yum repo。
答案3
(我回答完这个问题后才发现这个问题相同..所以认为我的答案也适用于此,值得重复一遍(在两个地方有答案更安全..)
据我所知,这正是阶段用途——它们允许您对类执行进行分组和排序。我使用“阶段”在 Debian 服务器上更新和配置 APT,这应该与您使用 YUM 执行的操作非常相似。
首先,在顶层(“节点”之上)声明“yum”阶段,以便“yum”阶段中的类将在“主要”阶段之前执行:
stage { 'yum' : before => Stage['main'] }
然后,将阶段分配给类。您可以在节点定义中执行此操作:
node default {
class { 'yumrepos' : stage => yum }
include packages
}
答案4
你需要使用的关键是要求关键字——“评估一个或多个类,将所需的类添加为依赖项。”
使用 apt 存储库的示例可能是:
class installcustompackages {
# make sure we have the repository file and public key
file { "/etc/apt/sources.list.d/myrepo.list":
source => "puppet://puppet/files/etc/apt/sources.list.d/myrepo.list",
ensure => present;
"/etc/apt/trusted.gpg":
source => "puppet://puppet/files/etc/apt/trusted.gpg",
}
# do an update whenever the list or trusted key file change
exec { "/usr/bin/apt-get update":
alias => "aptgetupdate",
require => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
subscribe => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
refreshonly => true;
}
package { "mypackage":
ensure => latest,
require => Exec["aptgetupdate"];
"mypackage2":
ensure => latest,
require => Exec["aptgetupdate"];
}
service { "myservice":
enable => false,
require => Package[mypackage];
}
}
(改编自这是 Puppet bootstrapping 的示例)。
因此,您可以看到每个阶段都需要先完成前一个阶段。我将让您自己研究如何将其应用于 yum,因为我不熟悉它存储文件的位置。