2

对于我当前的模块,我需要检查是否安装了 php 版本 5 或 7 并为此创建了一个事实。事实文件存储在facts.d/packageversion.rb的modules目录中,内容如下:

#!/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 代理日志中,我收到此错误:

事实文件 /var/lib/puppet/facts.d/packageversion.rb 被解析但返回一个空数据集

我该如何解决这个问题?

4

2 回答 2

3

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
于 2017-06-21T15:52:55.310 回答
1

马特舒查德所说的。

此外,您可能会认为 Approved Vox Populi Puppet 模块将此代码用于 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 版本的更好方法。

于 2017-06-21T16:55:17.660 回答