指定 Puppet 自定义事实的先决条件?

lar*_*sks 2 configuration-management puppet

我编写了一个自定义 Puppet 事实,需要biosdevname安装该工具。我不确定如何正确设置以便因子尝试实例化自定义事实之前安装此工具。

Facts 是在这个过程的早期加载的,所以我不能简单地把 apackage { biosdevname: ensure => installed }放在 manifest 中,因为当 Puppet 到达这里的时候,自定义的 fact 已经失败了。

我很好奇我是否可以通过 Puppet 的运行阶段解决这个问题。我试过:

stage { pre: before => Stage[main] }
class { biosdevname: stage => pre }
Run Code Online (Sandbox Code Playgroud)

和:

class biosdevname {
  package { biosdevname: ensure => installed }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用...... Puppet 在进入pre舞台之前加载事实:

info: Loading facts in physical_network_config
./physical_network_config.rb:33: command not found: biosdevname -i eth0
info: Applying configuration version '1320248045'
notice: /Stage[pre]/Biosdevname/Package[biosdevname]/ensure: created
Run Code Online (Sandbox Code Playgroud)

等等。有什么办法可以使这项工作?

编辑:我应该清楚地表明,如果给出合适的package声明,我理解该事实将在后续运行中正确运行。这里的困难在于这是我们初始配置过程的一部分。我们在 kickstart 之外运行 Puppet,并希望在第一次重启之前网络配置就位。

听起来唯一可行的解​​决方案是在初始系统配置期间简单地运行 Puppet 两次,这将确保必要的包就位。

另外,对于 Zoredache:

# This produces a fact called physical_network_config that describes
# the number of NICs available on the motherboard, on PCI bus 1, and on
# PCI bus 2.  The fact value is of the form <x>-<y>-<z>, where <x>
# is the number of embedded interfaces, <y> is the number of interfaces
# on PCI bus 1, and <z> is the number of interfaces on PCI bus 2.

em = 0
pci1 = 0
pci2 = 0

Dir['/sys/class/net/*'].each {
    |file| devname=File.basename(file)
    biosname=%x[biosdevname -i #{devname}]
    case 
    when biosname.match('^pci1')
        pci1 += 1
    when biosname.match('^pci2')
        pci2 += 1
    when biosname.match('^em[0-9]')
        em += 1
    end
}

Facter.add(:physical_network_config) do
    setcode do
        "#{em}-#{pci1}-#{pci2}"
    end
end
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 5

据我所知,你不能。要么让它失败,要么检测并优雅地失败。我有许多只在 Debian 上工作的插件,但在 Red Hat 上失败了而不会产生任何后果。

另外,请注意,在某些配置进入后评估事实是不可能的。架构只是不支持它:

Client                               Server
Compute facts
Ask for catalog passing facts =>     Receive Catalog request
                                     Compute catalog using facts
                              <=     Return Catalog
Based on the dependency tree,
  For each configuration with satisfied dependencies
    Apply configuration
    Mark (or not) dependency as satisfied
Send report, if configured so
Run Code Online (Sandbox Code Playgroud)

因此,您会看到,配置仅在处理事实之后很长时间才应用,并且无法返回。可能发生的情况是,下一次运行现在将能够生成该事实。

另请参阅Common 模块用于处理 Debian 上缺少 lsbrelease 而不会产生致命错误的技巧。