linux 覆盖因子'osfamily'值

llmtgqce  于 2023-03-17  发布在  Linux
关注(0)|答案(2)|浏览(134)

我通过从我的模块调用扩展了一个模块(pdxcat/collectd),基本模块倾向于将Amazon Linux操作系统家族标识为“Redhat”,但Puppet在Amazon Linux操作系统上安装的facter将操作系统报告为“Linux”。
我想通过在调用基础模块之前将osfamily的因子值从Linux覆盖到Redhat来纠正这个bug。
我的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
e0uiprwp

e0uiprwp1#

我认为试图覆盖社区模块的内置因子值是一种反模式,也就是说,在某些情况下(如上文所述),如果这不是一个社区模块(例如内部模块),您应该能够覆盖一个因子值。
如果这是针对内部模块的,则应查看事实优先级-https://docs.puppetlabs.com/facter/3.0/custom_facts.html#fact-precedence
因子决定解决方案优先级问题的方式是权重属性。一旦因子排除了由于限制语句而被排除的任何解决方案,将首先计算权重最高的解决方案。如果该解决方案返回nil,因子将继续处理下一个解决方案(按权重降序),直到获得该事实的值。
默认情况下,事实的重要性是该决议的限制数量,因此,更具体的决议优先于不太具体的决议。
给予它一个100的权重,看看事实解析会给你带来什么。

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

jw5wzhpr2#

这应该可以工作。还没有专门测试过,但是我使用类似的代码来修复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

相关问题