覆盖facter'osfamily'值

时间:2015-09-01 18:52:25

标签: linux amazon puppet overwrite facter

我通过从我的模块中调用它来扩展模块(pdxcat / collectd)。基本模块更喜欢将Amazon Linux OS家族标识为“Redhat”,但是亚马逊Linux操作系统上由puppet安装的因素将操作系统报告为“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

2 个答案:

答案 0 :(得分:1)

我认为尝试覆盖社区模块的内置因子值是一种反模式。这就是说有些情况(如上所述)你应该能够覆盖一个事实,因为这不是一个社区模块(例如内部)。

如果这是针对内部模块的,那么您应该查看事实优先级 - https://docs.puppetlabs.com/facter/3.0/custom_facts.html#fact-precedence

  

Facter决定解决优先权问题的方式是   重量属性。一旦Facter排除任何决议   因限制声明而被排除在外的决议中   首先评估最高重量。如果该分辨率为零,   Facter移动到下一个分辨率(通过降低重量)直到它   获得事实的价值。

     

默认情况下,事实的权重是该范围的限制数   分辨率,以便更具体的分辨率优先于更少   具体决议。

给它一个100的权重,看看你的事实分辨率。

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

答案 1 :(得分:0)

这应该有效。没有专门测试它,但我使用类似的代码来修复LXD下的LXC虚拟检测。

Facter[:osfamily].flush
Facter.add(:osfamily) do
  setcode do
    case Facter.value(:operatingsystem)
    when "Amazon"
      "RedHat"
    else
      Facter.value(:kernel)
    end
  end
end
相关问题