如何安排木偶自定义事实每 X 小时执行一次?

How to schedule puppet custom facts to execute every X hours?

我有一个自定义的人偶事实(用 ruby 编写),它执行一个简单的 bash 脚本。该脚本检查文件系统中的所有文件以获得世界可读的权限,并相应地得到 returns 结果。 puppet fact 检查脚本的输出,如果脚本输出不为空,则 returns "fail"。

问题是脚本是资源密集型的,我不希望它每 30 分钟执行一次(客户端'puppet.conf:运行internval=1800)。

我试过使用 "schedule" 资源,但由于 puppet 的工作方式,它只会影响我用来评估事实输出的 class。 Puppet 事实在每个 puppet 运行 上进行评估,而不管其他任何事情。 (从而使它们可用于资源)

我也曾尝试将执行 bash 脚本的代码从事实中移出并移到人偶 class 中,但您似乎无法评估 [=34= 的输出] 脚本(使用 "exec" 类型)并将其存储在变量中(同样,由于人偶的工作方式)。

我现在只能尝试使用 Ruby 语言应用某种调度机制,并在事实中实现它。我在 PStore 上阅读了一些内容,现在这似乎是一个不错的方向。

有谁知道如何让 ruby 脚本只在夜间执行?我不能使用 crontab,因为代码将由 puppet 运行。

人偶中的代码片段 class:

if $::myfact == 'fail' {
  notify { "warning blah blah...":
    loglevel => err,
    schedule => 'night',
   }
} 

木偶事实中的代码片段:

 require 'facter'
 Facter.add(:myfact) do
   setcode do
     if File.exists? '/usr/local/puppet/scripts/myscript.sh'
       result = Facter::Util::Resolution.exec("/usr/local/puppet/scripts/myscript.sh")
       if result != ''
         puts "Result of myfact is: \n #{result}"
       'fail'
     end
   end
 end

结束

您的自定义事实可以将其结果记录在系统某处的文件中。评估时,它可以将该文件上的时间戳与当前系统时间进行比较,并根据需要读回该值或重新计算该值。这也允许您延迟更新(例如,通过 touch 文件)或手动请求 re-evaluation(通过删除文件)。

但是,请考虑将代价高昂的评估与事实收集分离开来是否有意义。即使 Facter 只是偶尔 re-evaluate 从头开始​​,Facter 和 Puppet 也会花费很长时间来执行这些运行。您可以考虑使用计划作业以您喜欢的任何时间间隔执行评估,并让自定义事实 始终 依赖最新评估的缓存结果。