我通过从模块调用扩展了一个模块(pdxcat/collectd)。基本模块倾向于将amazon linux osfamily标识为“redhat”,但是puppet在amazon linux os上安装的factor将该操作系统报告为“linux”。
在调用基本模块之前,我想通过将osfamily的facter值从linux改写为redhat来纠正这个错误。
mymodule/lib/facter中的osfamily.rb是

Facter.add('osfamily') do
setcode do
   case Facter.value(:operatingsystem)
   when "Amazon"
      "RedHat"
   else
   Facter.value("kernel")
   end
 end
end

但问题是,我无法覆盖osfamily值。即使从osfamily.rb加载了事实,osfamily仍然被报告为“linux”,而不是“redhat”。
我的代码对于像osfamilytestoperatingsystemreleasetest之类的新值是正确的,但是对于现有值,如osfamilyoperatingsystemrelease不适用。
Puppet Version: 2.7.25
Facter Version: 1.6.18
Operating System:
Amazon Linux 2015.03
Puppet installation steps:
yum install puppet

最佳答案

我认为试图重写社区模块的内置factor值是一种反模式。也就是说,在某些情况下(如上面所述),如果这不是一个社区模块(如内部),您应该能够覆盖一个事实。
如果这是针对内部模块的,则应查看事实优先级-https://docs.puppetlabs.com/facter/3.0/custom_facts.html#fact-precedence
factor决定解决优先级问题的方式是
重量特性。一旦factor排除了
因限制性声明而被排除在外的决议
首先评估最高权重。如果决议结果为零,
factor继续下一个分辨率(通过降低权重),直到它
获取事实的值。
默认情况下,一个事实的权重是它的限制数
决议,以便更具体的决议优先于较少的决议
具体决议。
给它一个100的权重,看看分辨率给了你什么。

Facter.add('osfamily') do
  has_weight 100
  setcode do
    case Facter.value(:operatingsystem)
    when "Amazon"
      "RedHat"
    else
      Facter.value("kernel")
    end
  end
end

10-08 15:09