我通过从我的模块调用扩展了一个模块(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'。
我的代码对于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
2条答案
按热度按时间e0uiprwp1#
我认为试图覆盖社区模块的内置因子值是一种反模式,也就是说,在某些情况下(如上文所述),如果这不是一个社区模块(例如内部模块),您应该能够覆盖一个因子值。
如果这是针对内部模块的,则应查看事实优先级-https://docs.puppetlabs.com/facter/3.0/custom_facts.html#fact-precedence
因子决定解决方案优先级问题的方式是权重属性。一旦因子排除了由于限制语句而被排除的任何解决方案,将首先计算权重最高的解决方案。如果该解决方案返回nil,因子将继续处理下一个解决方案(按权重降序),直到获得该事实的值。
默认情况下,事实的重要性是该决议的限制数量,因此,更具体的决议优先于不太具体的决议。
给予它一个100的权重,看看事实解析会给你带来什么。
jw5wzhpr2#
这应该可以工作。还没有专门测试过,但是我使用类似的代码来修复LXD下的LXC虚拟检测。