在执行其他任何操作之前,将yum仓库添加到木偶中


26

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


对于更复杂的用例,另请参阅我的相关问题
Matt McClure 2012年

Answers:


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
   }
}

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

class foo {
   package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}

这将确保

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

喔好吧。太棒了 我没有在那儿看到yumrepo-谢谢!
乔恩·哈达德

它仅适用于使用Yum的发行版,因此仅适用于Rhel5,而不适用于Rhel4
Dave Cheney 2010年

2
如果我不知道哪个存储库有软件包会怎样?例如,在Fedora上的fedora存储库和RHEL,CentOS等上的epel存储库中可能有一个软件包。这意味着,如果我使用第三方配方/模块,则必须对其进行自定义。
Cristian Ciupitu 2011年

17

尽管阶段可以处理此问题,并且特定的yum repo依赖项也可以处理,但更好的方法是一般地声明该关系。

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

node default {
  Yumrepo <| |> -> Package <| provider != 'rpm' |>
}

这样一来,所有yumrepo类型的文件都将在没有'rpm'作为其提供程序的任何软件包之前得到处理。后一个排除是为了让我可以使用(例如)epel-release RPM软件包来帮助安装yum存储库。


8

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

据我了解,这正是阶段的目的-它们使您可以对类的执行进行分组和排序。我使用“阶段”来更新和配置Debian服务器上的APT,这应该与您对YUM所做的非常相似。

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

stage { 'yum' : before => Stage['main'] }

然后,您将舞台分配给这些类。您可以在节点定义中执行此操作:

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

  include packages
}

谢谢您:)我个人更喜欢这种方法来接受答案。
Michael Mior

5

您可以使用标签。这将允许您使用firstrun或标记存储库安装程序,

然后跑

 puppetd --tags firstrun

并且只会执行与标记匹配的模块/语句。


这正是我想要的-谢谢汤姆!
乔恩·哈达德

3

您需要使用的关键是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];
   }
}

(改编自木偶引导示例)。

因此,您可以看到每个阶段如何要求首先完成上一个阶段。我将让您研究如何将此方法应用于yum,因为我对其存储文件的位置并不熟悉。


0

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
   }
}

上面的这段代码将在添加软件包之前添加仓库。


10
木偶使用说明性语言,所以它并没有担心的事情在文件中的顺序。恐怕您的第一段是错误的。正确的方法是使用require在第二部分中完成的关键字。
Hamish Downer

0

这样的事情对我有用:

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上包含了类似的内容。这样,您的人偶模块就不会引用yum repos。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.