我通过从我的模块中调用它来扩展模块(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”。
我的代码适用于osfamilytest
或operatingsystemreleasetest
等新值,但不适用于osfamily
或operatingsystemrelease
等现有值。
Puppet Version: 2.7.25
Facter Version: 1.6.18
Operating System:
Amazon Linux 2015.03
Puppet installation steps:
yum install puppet
答案 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