我通过从我的模块调用它扩展了一个模块(pdxcat/collectd)。基本模块倾向于将Amazon Linux OS家族识别为'Redhat',但puppet在Amazon Linux OS上安装的因子将操作系统报告为'Linux'。
我想通过在调用基本模块之前将osfamily的因子值从Linux覆盖到Redhat来纠正这个错误。
我osfamily。mymodule/lib/factor中的Rb
Facter.add('osfamily') do
setcode do
case Facter.value(:operatingsystem)
when "Amazon"
"RedHat"
else
Facter.value("kernel")
end
end
end
但问题是,我无法覆盖osfamily值。即使从osfamily下载事实。br, 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
我认为试图覆盖社区模块的内置因子值是一种反模式。也就是说,在某些情况下(如上所述),你应该能够覆盖一个事实,因为这不是一个社区模块(例如内部)。
如果这是一个内部模块,你应该查看事实优先级- https://docs.puppetlabs.com/facter/3.0/custom_facts.html#fact-precedence
factor决定解析优先级的方法是重量的财产。一旦因素排除了任何决议排除因为限制语句,决议用首先评估最高的权重。如果那个解析返回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
应该可以。没有专门测试过,但我使用类似的代码来修复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