1

我通过从我的模块中调用一个模块(pdxcat/collectd)来扩展它。基本模块更喜欢将 Amazon Linux OSfamily 标识为“Redhat”,但由 puppet 在 Amazon Linux OS 上安装的因子将操作系统报告为“Linux”。

我想通过在调用基本模块之前将 osfamily 的因子值从 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”。

我的代码对于像or这样的新值可以正常工作,但对于像osfamilytestoroperatingsystemreleasetest这样的现有值不能。osfamilyoperatingsystemrelease

Puppet Version: 2.7.25 
Facter Version: 1.6.18 
Operating System:
Amazon Linux 2015.03 
Puppet installation steps:
yum install puppet
4

2 回答 2

1

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

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

Facter 决定解决优先级问题的方式是权重属性。一旦 Facter 排除了由于 confine 语句而被排除的任何解决方案,首先评估具有最高权重的解决方案。如果该分辨率返回 nil,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
于 2015-09-02T11:55:15.717 回答
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
于 2016-09-28T19:46:57.980 回答