有没有办法迫使傀儡先做某些事情? 例如,我需要它在所有服务器上安装一个RPM,以在我安装任何软件包之前添加一个yum仓库(IUS社区)。
如果你想确保一个仓库安装在你的所有服务器上,那么我会build议这样的事情
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
虽然阶段可以处理这个,所以可以具体的百胜回购依赖关系,更好的是声明关系一般。
只要把Yumrepo <| |> -> Package <| provider != 'rpm' |>
Yumrepo <| |> -> Package <| provider != 'rpm' |>
Yumrepo <| |> -> Package <| provider != 'rpm' |>
在您的傀儡清单。
node default { Yumrepo <| |> -> Package <| provider != 'rpm' |> }
这使得所有yumrepotypes在没有“rpm”的软件包作为其提供者之前将被处理。 后面的排除是我可以使用(例如)epel-release RPM软件包来帮助安装yum repo。
(我发现这个问题后,我回答几乎相同 ..所以认为我的答案适用于此,这是值得重复它(在两个地方有一个答案是更安全的..)
据我所知,这正是阶段性的 – 他们让你分组和sorting类执行。 我使用“阶段”来更新和configurationDebian服务器上的APT,这应该与您将要使用YUM进行的操作非常相似。
首先,你在顶层(高于“节点”)宣布“yum”阶段,这样“yum”阶段中的类将在“主”阶段之前执行:
stage { 'yum' : before => Stage['main'] }
然后,你把舞台分配给class级。 你可以在你的节点定义中做到这一点:
node default { class { 'yumrepos' : stage => yum } include packages }
你可以使用标签 。 这将允许你用firstrun
或东西来标记repo安装程序,
然后运行
puppetd --tags firstrun
它只会执行与标签匹配的模块/语句。
您需要使用的关键是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]; } }
(从这个木偶bootstrapping的例子 )。
所以你可以看到每个阶段如何要求先完成前一个阶段。 我会离开你去研究如何把这个应用到百胜,因为我不熟悉它存储文件的位置。
木偶从上到下读取configuration,所以如果你在该类中首先包含一个带有yum回购的类,那么这个回购将会在别的之前被添加。
如果您在软件包上使用require设置,则在添加软件包之前将确保所需的资源types存在,如下所示:
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 } }
上面的代码将在添加包之前添加回购。
像这样的东西对我有用:
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中包含了这样的内容。 这样,你的傀儡模块,免费参考百胜回购。