Puppet 来自自定义傀儡事实的Shell命令?

Puppet 来自自定义傀儡事实的Shell命令?,puppet,facter,Puppet,Facter,很抱歉,可以使用Facter::Core::Execution.exec从自定义事实执行shell命令。我用以下代码证明了这一点: Facter.add(:controller_id) do setcode do Facter::Core::Execution.exec('/usr/bin/jq -r .device._id /var/lib/mylib/system.json') end end 当我在代理上独立运行命令时,比如/usr/bin/jq-r.device.\u

很抱歉,可以使用
Facter::Core::Execution.exec
从自定义事实执行shell命令。我用以下代码证明了这一点:

Facter.add(:controller_id) do
  setcode do
    Facter::Core::Execution.exec('/usr/bin/jq -r .device._id /var/lib/mylib/system.json')
  end
end
当我在代理上独立运行命令时,比如
/usr/bin/jq-r.device.\u id/var/lib/mylib/system.json
,它会返回一个字符串。但是当我使用
puppet代理在我的代理上运行事实时-t
PuppetDb不包含新的事实

我可以看到代理看到新的事实代码,因为它告诉我我的代码已更改:

注意: /文件[/opt/puppetlabs/puppet/cache/lib/facter/controller_id.rb]/content: 内容将“{md5}c3567db500497e3586617bfed072ca6d”更改为 “{md5}BB617198C5612EE365B5AF8D410D4BC”


但是没有返回错误,告诉我为什么没有保存事实。有人知道是什么导致了这个问题吗?

尝试
`/usr/bin/jq-r.device.\u id/var/lib/mylib/system.json`
返回一个字符串。@MattSchuchard谢谢,与以前不同,现在正在记录这个事实,但它是一个空字符串。即使通常从代理运行该命令,它也会返回一个字符串。在收集事实时,该命令以root用户身份运行,不带ENV。这会引起问题吗?另外,如果您试图解析系统上
json
文件中的信息,您可以使用Ruby从本质上做到这一点,而不必使用shell命令。@MattSchuchard感谢我能够使用Ruby完成我需要的工作。我仍然很好奇为什么jq程序不会运行。我将在周一调查可能的环境问题。干杯。如果命令将其输出写入其标准错误,而不是其标准输出,那么Facter可能不会捕获它。在任何情况下,您应该考虑将此写入Ruby原生的事实,但此时您需要首先清理来自所有客户端系统的(非工作的)Ruby事实。这不会直接解决您的问题,但该设施是专为这样的情况而设计的。