0

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

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

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

我还尝试将执行 bash 脚本的代码从事实中移出并移到 puppet 类中,但您似乎无法评估 bash 脚本的输出(使用“exec”类型)并将其存储在变量中(再次,因为 puppet 的工作方式)。

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

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

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

结尾

4

1 回答 1

2

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

但是,请考虑将代价高昂的评估与事实收集分离是否有意义。即使 Facter 只是偶尔需要从头开始重新评估事实,Facter 以及因此 Puppet 将需要很长时间来执行这些运行。您可以考虑改为使用计划作业以您喜欢的任何时间间隔执行评估,并让自定义事实始终依赖于这些评估中最新的缓存结果。

于 2016-01-05T20:59:28.513 回答