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

Ruby 如何安排puppet自定义事实每X小时执行一次?,ruby,puppet,schedule,facter,Ruby,Puppet,Schedule,Facter,我有一个自定义的puppet fact(用ruby编写),它执行一个简单的bash脚本。该脚本检查文件系统中的所有文件是否具有世界可读权限,并相应地返回结果。puppet事实检查脚本的输出,如果脚本输出不为null,则返回“fail” 问题是脚本是资源密集型的,我不希望每30分钟执行一次(client'puppet.conf:runinterval=1800) 我尝试过使用“schedule”资源,但由于puppet的工作方式,它只影响我用来评估事实输出的类。木偶事实会在每次木偶运行时进行评估,

我有一个自定义的puppet fact(用ruby编写),它执行一个简单的bash脚本。该脚本检查文件系统中的所有文件是否具有世界可读权限,并相应地返回结果。puppet事实检查脚本的输出,如果脚本输出不为null,则返回“fail”

问题是脚本是资源密集型的,我不希望每30分钟执行一次(client'puppet.conf:runinterval=1800)

我尝试过使用“schedule”资源,但由于puppet的工作方式,它只影响我用来评估事实输出的类。木偶事实会在每次木偶运行时进行评估,而不考虑其他因素。(从而使它们能够获得资源)

我还尝试将执行bash脚本的代码从事实中移出并放入puppet类中,但似乎无法计算bash脚本的输出(使用“exec”类型)并将其存储在变量中(同样,这是因为puppet的工作方式)

现在我不得不尝试使用Ruby语言应用某种调度机制,并在实际中实现它。我在PStore上读过一些文章,现在这似乎是一个好的方向

有人知道我如何让ruby脚本只在晚上执行吗?我不能使用crontab,因为代码将由puppet运行

puppet类的代码段:

if $::myfact == 'fail' {
  notify { "warning blah blah...":
    loglevel => err,
    schedule => 'night',
   }
} 
来自puppet事实的代码片段:

 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

结束

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


但是,请考虑将昂贵的评估与事实收集分离是否有意义。即使Facter只是偶尔需要从头开始重新评估事实,Facter——因此也是Puppet——也需要很长时间来执行这些运行。你可以考虑使用一个预定的工作来按你喜欢的任何间隔来执行评估,并且定制的事实总是依赖于最新的这些评估的缓存结果。

……使用一个预定的工作来执行评估……“这意味着我需要用CRONTAPS和本地缓存来复杂化我的木偶代码,是吗?@amirb,而不是用同样的方法使事实代码复杂化,是的。是的,你应该这样做。