繁体   English   中英

覆盖事实的“家庭”价值

[英]overwrite facter 'osfamily' value

我通过从我的模块调用扩展了模块(pdxcat / collected)。 基本模块倾向于将Amazon Linux OS系列标识为“ Redhat”,但是由puppet在Amazon Linux OS上安装的事实将操作系统报告为“ Linux”。

我想通过在调用基本模块之前覆盖从Linux到Redhat的osfamily的事实值来纠正此错误。

我的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”。

我的代码对于osfamilytestoperatingsystemreleasetest类的新值正确operatingsystemreleasetest但对于osfamilyoperatingsystemrelease类的现有值osfamily

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

Facter决定分辨率优先级问题的方式是权重属性。 一旦Facter排除了由于限制语句而排除的任何分辨率,则将首先评估权重最高的分辨率。 如果该分辨率返回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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM