Answers:
如果您要确保在所有服务器上都安装了存储库,那么我建议这样
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存储库,否则不会安装该软件包(我在回答几乎相同的问题后发现了这个问题。所以以为我的回答也适用于此,值得重复一遍(在两个地方回答比较安全。)
据我了解,这正是阶段的目的-它们使您可以对类的执行进行分组和排序。我使用“阶段”来更新和配置Debian服务器上的APT,这应该与您对YUM所做的非常相似。
首先,在顶层(在“节点”之上)声明“ yum”阶段,以便在“ yum”阶段的类将在“ main”阶段之前执行:
stage { 'yum' : before => Stage['main'] }
然后,您将舞台分配给这些类。您可以在节点定义中执行此操作:
node default {
class { 'yumrepos' : stage => yum }
include packages
}
您需要使用的关键是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,因为我对其存储文件的位置并不熟悉。
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
}
}
上面的这段代码将在添加软件包之前添加仓库。
require
在第二部分中完成的关键字。
这样的事情对我有用:
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。