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

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

事实是在这个过程的早期加载的,所以我不能简单地在清单中放置一个package { biosdevname: ensure => installed } ,因为在Puppet得到这个的时候,这个自定义事实已经失败了。

我很好奇,如果我能通过Puppet的运行阶段来解决这个问题的话。 我试过了:

 stage { pre: before => Stage[main] } class { biosdevname: stage => pre } 

和:

 class biosdevname { package { biosdevname: ensure => installed } } 

但是这不起作用……木偶在进入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 

等等有什么办法可以做到这一点?

编辑 :我应该清楚,我明白,给一个合适的package声明,事实将在后续运行正确运行。 这里的困难在于,这是我们初始configuration过程的一部分。 我们正在使用kickstart运行Puppet,并希望networkingconfiguration在第一次重新启动之前就位。

这听起来像是唯一可行的解​​决scheme是在初始系统configuration期间简单地运行两次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 

  • 有没有办法改变cfengine策略服务器IP而不重新启动所有的客户端?
  • 厨师的最佳做法/问题
  • 格式化来自pipe理数据库的数据
  • 为什么Puppet只需要一个包?
  • 如何将parameter passing给傀儡模块?
  • Ansiblevariables优先
  • 3 Solutions collect form web for “指定Puppet自定义事实的先决条件?”

    据我所知,你不能。 要么让它失败,要么发现并优雅地失败。 我有一些只能在Debian上运行的插件,而且没有任何后果。

    另外,请注意,在进行一些configuration之后,对事实进行评估是不可能的。体系结构不支持:

     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 

    所以,你看,这个configuration只是在事实处理很久之后才被应用,而且没有办法返回。 可能发生的是, 下一次运行现在将能够产生这个事实。

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

    添加一个检查到事实代码本身。 在尝试运行之前检查biosdevname是否存在。 如果不存在,请将该值设置为undef。 在清单中使用if语句,要求事实具有一定的价值。

    您可以在插件中添加条件来检查各种事情,然后添加事实,另外Facter有一个“confine”方法,它只会根据其他事实条件运行Facter发现(例如,Windows对Facter的支持严重依赖于Confine)

    一个条件事实的例子:

     if File.exists?("/usr/bin/mysql") Facter.add(:mysql_version) do %x[#{mysqlcmd} "SELECT VERSION()"].to_s.strip end end 

    一个Confine的例子:

     # Packaging on OpenBSD. Doesn't work anywhere else that I know of. Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Package do desc "OpenBSD's form of `pkg_add` support." commands :pkginfo => "pkg_info", :pkgadd => "pkg_add", :pkgdelete => "pkg_delete" defaultfor :operatingsystem => :openbsd confine :operatingsystem => :openbsd 
    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.