2016-01-05 99 views
0

我有一个自定义puppet的事实(用ruby编写),它执行一个简单的bash脚本。脚本检查文件系统中的所有文件以获得世界可读的权限并相应地返回结果。傀儡事实检查脚本的输出,如果脚本输出不为空,则返回“失败”。如何安排木偶自定义事实每隔X小时执行一次?

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

我试过使用“日程表”资源,但由于傀儡工作方式,它只影响我用来评估事实的输出的类。无论其他事情如何,木偶运行中都会对木偶事实进行评估。 (从而使它们可用于资源)

我也尝试将执行bash脚本的代码从事实移到puppet类中,但它看起来无法评估bash脚本的输出(使用“ exec“类型)并将其存储在一个变量中(再次,因为木偶的工作方式)。

我现在正在尝试应用某种使用Ruby语言的调度机制,并在实际中实现它。我已经阅读了一些PStore,现在看来这是一个很好的方向。

有谁知道我可以如何使一个红宝石脚本只在夜间执行?我不能使用crontab,因为代码将由puppet运行。从木偶类

代码段:从木偶事实

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 

回答

1

您的自定义其实可以在一个文件某处纪念它的结果系统。评估时,它可以将该文件的时间戳与当前系统时间进行比较,并且可以回读该值或根据情况重新进行计算。这也允许您推迟更新(例如,通过文件的touch)或手动请求重新评估(通过删除文件)。

但是,考虑将昂贵的评估与事实收集分离是否合理。即使Facter只是偶尔需要从头开始重新评估这个事实,Facter - 因此Puppet - 将花费很长时间来执行这些运行。您可以考虑改为使用预定作业以您喜欢的任何时间间隔执行评估,并且自定义事实总是依赖于来自最新评估的缓存结果。

+0

“...使用预定作业执行评估......”这意味着我需要使用crontabs和本地缓存来使我的puppet代码复杂化,不是吗? – amirb

+1

@amirb而不是使你的事实代码复杂化,是的。是的,你应该这样做。 –

相关问题