在执行其他操作之前,先将 yum repo 添加到 puppet

在执行其他操作之前,先将 yum repo 添加到 puppet

有没有办法强制 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,因为我不熟悉它存储文件的位置。

相关内容