[英]How to schedule puppet custom facts to execute every X hours?
我有一个自定义的木偶事实(用红宝石编写),它执行一个简单的bash脚本。 该脚本检查文件系统中的所有文件是否具有世界可读的权限,并相应地返回结果。 木偶事实检查脚本的输出,如果脚本输出不为空,则返回“失败”。
问题在于该脚本占用大量资源,我不希望每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
结束
您的自定义事实可以将其结果记录在系统中某个文件中。 评估后,它可以将该文件上的时间戳与当前系统时间进行比较,并根据需要读回该值或重新进行计算。 这还允许您推迟更新(例如,通过touch
文件)或手动请求重新评估(通过删除文件)。
但是,请考虑将昂贵的评估与事实收集脱钩是否有意义。 即使Facter仅偶尔需要从头开始重新评估事实,Facter以及Puppet仍然需要很长时间才能执行这些运行。 您可以考虑使用调度的作业以您希望的任何时间间隔执行评估,并使自定义事实始终依赖于最新评估中的缓存结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.