2017-06-21 11 views
2

对于我当前的模块,我需要检查是否安装了PHP版本5或7,并为此创建了一个事实。事实上文件存储在modules目录中facts.d/packageversion.rb并具有以下内容:事实文件被解析,但返回一个空的数据集

#!/usr/bin/ruby 
require 'facter' 

Facter.add(:php_version) do 
    setcode do 
    if File.directory? '/etc/php5' 
     5 
    else 
     if File.directory? '/etc/php7' 
     7 
     else 
     0 
     end 
    end 
    end 
end 

但我不能我的模块中使用它。在Puppet代理日志中,我收到此错误:

Fact file /var/lib/puppet/facts.d/packageversion.rb was parsed but returned an empty data set

我该如何解决这个问题?

回答

2

facts.d是外部事实的模块目录。您可以将此文件放入外部事实目录,但预期的输出将需要键值对。这没有发生,所以Puppet没有为这个事实找到数据集。 https://docs.puppet.com/facter/3.6/custom_facts.html#executable-facts-----unix

您已将此事实写成自定义事实而非外部事实。因此,它需要放置在模块的lib/facter目录中。然后它会正常运行。我注意到这些重要信息似乎已从最新的Facter文档中删除,这可能会导致您的困惑。

而且,考虑使用你的代码的elsif的清晰度和优化:

if File.directory? '/etc/php5' 
    5 
elsif File.directory? '/etc/php7' 
    7 
else 
    0 
end 
+0

使用这个逻辑,如果你有两个安装它只报告5 –

+0

完美,谢谢!不知道它在错误的目录中。 – Studentus

1

什么马特Schuchard说。

此外,你可能会认为,批准人民呼声木偶模块使用this代码PHP版本:

Facter.add(:phpversion) do 
    setcode do 
    output = Facter::Util::Resolution.exec('php -v') 

    unless output.nil? 
     output.split("\n").first.split(' '). 
     select { |x| x =~ %r{^(?:(\d+)\.)(?:(\d+)\.)?(\*|\d+)} }.first 
    end 
    end 
end 

注意Facter::Util::Resolution.exec是赞成不赞成Facter::Core::Execution.exec

除此之外,您可能会认为这是获取PHP版本的更好方法。

+0

是的,我正要说,我认为'Facter :: Util :: Resolution'已被弃用。看起来模块需要更新。 –