我想有一种方法,只在特定的时间每天评估一次特定的课程。 现在我从cron运行我的木偶代理,但是我想把它改成运行一个守护进程,或者更频繁地运行。 增加频率的障碍是有一类需要4分钟左右的时间处理,而且不需要经常发生。 我试图find一些方法来从cron每天只评估一次特定的类。
有没有一个简单的方法来设置一个环境variables( FOO=bar;puppet agent .. ),或者添加一个命令行选项( puppet agent .. --foo bar )到crontab中,这将成为我可以使用的一个事实在我的清单中是否包含课程?
class foobar { if 'bar' == $::foo { # do the slow stuff } }
一个时间表听起来像它会提供你在找什么。 首先创build一个时间表资源,用于指定事件在某个特定时间段内的运行时间和次数。
schedule { "slow": range => "1 - 5", period => daily, repeat => 1, }
上面的例子只会在上午1点和上午5点的时间内进行评估或运行,最多只能运行一次。 您可以删除range参数,它将在一天中的任何时间运行,但是只能再次运行一次。
在资源上,然后指定schedule 元参数以将它们链接到上述计划:
exec { "example": command => "/usr/bin/foo", unless => "/usr/bin/bar", schedule => "slow", }
当您使用--debug运行Puppet时,如果已经评估了给定的次数或者范围不适用,您将看到以下内容:
debug: /Stage[main]//Exec[example]: Not scheduled
如果您有一些资源,则可以使用您所限制的类中的资源缺省值来影响相同types的所有资源:
Exec { schedule => "slow", }
您需要为每个资源types执行此操作 – Exec,File,Augeas等
一些关于改进的笔记:
schedule元参数应用到类似乎不工作,可能是值得提出一个错误 我相信你可以通过环境声明来实现这一点。 您可以在命令行上调用它:
puppet agent --environment latetbus
您可以使用它在puppet.conf文件中指定不同的清单:
[latebus] manifest = $confdir/latetbus/site.pp
甚至可以用这种方式做不同的模块。
还有一种方法可以添加自定义事实 。 这利用插件来完成工作。 你创build一个自定义的ruby文件来检查一些东西:
# run_latebus.rb facter.add("latebus_exec") do setcode do %x{if [ -e /tmp/run_latebus ] ; then echo "true" ; else echo "false" ; fi}.chomp end end
在启动puppet agent之前,木偶代理调用脚本会touch /etc/run_latebus , puppet agent将在木偶运行中由Facter评估。
.rb文件放置在自定义模块中,特别是在模块本身的lib/facter目录中。