在做任何其他事情之前向 puppet 添加一个 yum repo

Jon*_*dad 26 puppet

有没有办法强制人偶先做某些事情?例如,在安装任何软件包之前,我需要它在所有服务器上安装 RPM 以添加 yum 存储库(IUS 社区)。

Dav*_*ney 37

如果您想确保在所有服务器上都安装了存储库,那么我建议您这样做

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
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,对于任何扩展的节点,base您可以说

class foo {
   package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}
Run Code Online (Sandbox Code Playgroud)

这将确保

  • bar除非定义了 IUS 存储库,否则不会安装该软件包
  • 在定义 IUS 存储库之前,该软件包不会尝试安装

  • 如果我不知道哪个存储库有一个包会发生什么?例如,Fedora 上的 *fedora* 存储库和 RHEL、CentOS 等的 *epel* 存储库中可能有一个包。这意味着如果我使用 3rd 方配方/模块,我将不得不对其进行自定义。 (2认同)

小智 18

尽管 stage 可以处理这个问题,也可以处理特定的 yum repo 依赖项,但最好是通用地声明这种关系。

只需放入 Yumrepo <| |> -> Package <| provider != 'rpm' |>您的木偶清单。

node default {
  Yumrepo <| |> -> Package <| provider != 'rpm' |>
}
Run Code Online (Sandbox Code Playgroud)

这使得所有 yumrepo 类型将在任何没有“rpm”作为其提供者的包之前得到处理。后一种排除是为了我可以使用(例如)epel-release RPM 包来帮助安装 yum 存储库。


Ale*_*rov 8

(我在回答几乎相同的问题后发现了这个问题..所以我认为我的回答也适用于这里,值得重复一遍(在两个地方回答更安全..)

据我了解,这正是阶段的用途——它们让您可以对类执行进行分组和排序。我使用“stages”在 Debian 服务器上更新和配置 APT,这应该与您将使用 YUM 进行的操作非常相似。

首先,您在顶层(“节点”上方)声明“yum”阶段,以便“yum”阶段中的类将在“主要”阶段之前执行:

stage { 'yum' : before => Stage['main'] }
Run Code Online (Sandbox Code Playgroud)

然后,您将阶段分配给类。您可以在节点定义中正确执行此操作:

node default {
  class { 'yumrepos' : stage => yum }

  include packages
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*nor 5

你可以使用标签。这将允许您使用firstrun或其他东西标记 repo 安装程序,

然后运行

 puppetd --tags firstrun
Run Code Online (Sandbox Code Playgroud)

它只会执行与标签匹配的模块/语句。