Jon Haddad Asked: 2010-02-11 16:49:27 +0800 CST2010-02-11 16:49:27 +0800 CST 2010-02-11 16:49:27 +0800 CST 在做任何其他事情之前向 puppet 添加一个 yum repo 772 有没有办法强制傀儡先做某些事情?例如,在我安装任何软件包之前,我需要它在所有服务器上安装一个 RPM 以添加一个 yum 存储库(IUS 社区)。 puppet 7 个回答 Voted Best Answer Dave Cheney 2010-02-21T20:52:55+08:002010-02-21T20:52:55+08:00 如果您想确保在所有服务器上都安装了存储库,那么我建议您这样做 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 存储库之前,该软件包不会尝试安装 Steven Roberts 2012-12-31T17:01:27+08:002012-12-31T17:01:27+08:00 虽然阶段可以处理这个问题,特定的 yum repo 依赖项也可以,但更好的是一般地声明关系。 只需放入 Yumrepo <| |> -> Package <| provider != 'rpm' |>您的木偶清单。 node default { Yumrepo <| |> -> Package <| provider != 'rpm' |> } 这使得所有 yumrepo 类型都将在没有 'rpm' 作为其提供者的任何包之前得到处理。后者的排除是为了让我可以使用(例如)epel-release RPM 包来帮助安装 yum 存储库。 Alexander Azarov 2011-06-07T04:53:54+08:002011-06-07T04:53:54+08:00 (我在回答几乎相同之后发现了这个问题..所以认为我的答案也适用于这里,值得重复一遍(在两个地方有答案更安全..) 据我了解,这正是阶段的用途——它们允许您对类执行进行分组和排序。我使用“阶段”在 Debian 服务器上更新和配置 APT,这应该与您将要使用 YUM 执行的操作非常相似。 首先,您在顶层(在“节点”之上)声明“yum”阶段,以便“yum”阶段中的类将在“main”类之前执行: stage { 'yum' : before => Stage['main'] } 然后,您将阶段分配给类。您可以在节点定义中正确执行此操作: node default { class { 'yumrepos' : stage => yum } include packages } Tom O'Connor 2010-02-12T00:51:03+08:002010-02-12T00:51:03+08:00 你可以使用标签。这将允许您使用firstrun或标记 repo 安装程序, 然后运行 puppetd --tags firstrun 它只会执行与标签匹配的模块/语句。 Hamish Downer 2010-02-21T15:22:57+08:002010-02-21T15:22:57+08:00 您需要使用的关键是require关键字——“评估一个或多个类,将所需的类添加为依赖项”。 使用 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,因为我不熟悉它存储文件的位置。 tore- 2010-02-28T04:00:08+08:002010-02-28T04:00:08+08:00 Puppet 从上到下读取配置,因此如果您首先在该类中包含一个带有 yum 存储库的类,则此存储库将在其他任何内容之前添加。 如果您在包上使用 require 设置,您将确保在添加包之前存在所需的资源类型,如下所示: node 'yournode.domain.com' { package { "bar": ensure => installed, require => Yumrepo["IUS"] } yumrepo { "IUS": baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture", descr => "IUS Community repository", enabled => 1, gpgcheck => 0 } } 上面的代码将在添加包之前添加 repo。 Oscar Montoya 2015-02-10T15:56:01+08:002015-02-10T15:56:01+08:00 像这样的东西对我有用: yumrepo { A: descr => "A repo", baseurl => '', enabled => 1, gpgcheck => 1, gpgkey => "", priority => 3 } yumrepo { B: descr => "B repo", baseurl => '', enabled => 1, gpgcheck => 1, gpgkey => "", priority => 3 } yumrepo { C: descr => "C repo", baseurl => '', enabled => 1, gpgcheck => 1, gpgkey => "", priority => 3; } Package { require => [Yumrepo[A], Yumrepo[B], Yumrepo[C]] } 我在 mysite.pp 上包含了类似的内容。这样,您的 puppet 模块就不会引用 yum repos。
如果您想确保在所有服务器上都安装了存储库,那么我建议您这样做
然后,对于任何扩展的节点,
base
您都可以说这将确保
bar
除非定义 IUS 存储库,否则不会安装该软件包虽然阶段可以处理这个问题,特定的 yum repo 依赖项也可以,但更好的是一般地声明关系。
只需放入
Yumrepo <| |> -> Package <| provider != 'rpm' |>
您的木偶清单。这使得所有 yumrepo 类型都将在没有 'rpm' 作为其提供者的任何包之前得到处理。后者的排除是为了让我可以使用(例如)epel-release RPM 包来帮助安装 yum 存储库。
(我在回答几乎相同之后发现了这个问题..所以认为我的答案也适用于这里,值得重复一遍(在两个地方有答案更安全..)
据我了解,这正是阶段的用途——它们允许您对类执行进行分组和排序。我使用“阶段”在 Debian 服务器上更新和配置 APT,这应该与您将要使用 YUM 执行的操作非常相似。
首先,您在顶层(在“节点”之上)声明“yum”阶段,以便“yum”阶段中的类将在“main”类之前执行:
然后,您将阶段分配给类。您可以在节点定义中正确执行此操作:
你可以使用标签。这将允许您使用
firstrun
或标记 repo 安装程序,然后运行
它只会执行与标签匹配的模块/语句。
您需要使用的关键是require关键字——“评估一个或多个类,将所需的类添加为依赖项”。
使用 apt 存储库的示例可能是:
(改编自puppet bootstrapping 的这个例子)。
因此,您可以看到每个阶段如何要求先完成前一个阶段。我会让你弄清楚如何将它应用于 yum,因为我不熟悉它存储文件的位置。
Puppet 从上到下读取配置,因此如果您首先在该类中包含一个带有 yum 存储库的类,则此存储库将在其他任何内容之前添加。
如果您在包上使用 require 设置,您将确保在添加包之前存在所需的资源类型,如下所示:
上面的代码将在添加包之前添加 repo。
像这样的东西对我有用:
我在 mysite.pp 上包含了类似的内容。这样,您的 puppet 模块就不会引用 yum repos。