使用日程表资源
使用启用了 schedule
参数的资源,你可以控制当前资源何时被应用。 例如,你希望如下的 exec
资源每天应用一次,将资源参数 schedule
设置成了内置的值 daily
:
exec { "/usr/bin/apt-get update": schedule => daily, }
遗憾的是,给 schedule
参数指定 daily
并不能保证该资源每天都能应用一次。 内置的 daily
仅能限制 exec
资源在一天之内不能被应用多余一次, 但是资源是否被应用以及何时被应用完全取决于 Puppet 是否运行以及何时运行。
正因为如此,使用 schedule
资源才是安排执行其他资源的最佳选择。例如, 你可能想要确保 apt-get update
一小时内运行不超过一次; 或者确保一项维护工作在白天生产时间期间不被执行。
为此,你需要创建自己的 schedule
资源。
操作步骤
添加如下代码到你的配置清单:
schedule { "not-in-office-hours": period => daily, range => [ "17:00-23:59", "00:00-09:00" ], repeat => 1, } exec { "/bin/echo Doing maintenance!": schedule => "not-in-office-hours", }
Run Puppet。
工作原理
我们创建了名为 not-in-office-hours
的 schedule
,它指定了重复周期为 daily
, 且指定了允许的时间范围为下午 5 点到次日早上 9 点:
period => daily, range => [ "17:00-23:59", "00:00-09:00" ],
我们同时设置了在每个时间周期内资源被应用的最大次数为 1:
repeat => 1,
然后,我们在如下的 exec
资源中使用这个自定义的 schedule
:
exec { "/bin/echo Doing maintenance!": schedule => "not-in-office-hours", }
若 exec
资源不使用 schedule
参数,每次运行 Puppet,这个 exec
资源就会被应用一次。 现在,Puppet 将依照 not-in-office-hours
资源的设置做如下测试:
当前时间是否在允许的范围内
在一个重复周期内,资源是否已经应用到了允许的最大次数
例如,让我考察在如下连续的几个小时内如果 Puppet 每小时执行一次将会发生什么:
4 p.m.:超出了允许的时间范围,所以 Puppet 不会做任何事情。
5 p.m.:在允许的时间范围内,且在此重复周期内还没有运行过,所以 Puppet 会应用此资源。
6 p.m.:在允许的时间范围内,且在此重复周期内已经运行过一次,由于已经到达了
repeat
设置的最大值,所以 Puppet 不会做任何事情。
依此类推,直到第二天再重复这一过程。
更多用法
如果需要,你可以增大 repeat
参数的值,例如:在每小时内运行一个作业不超过 6 次:
period => hourly, repeat => 6,
要记住这不能保证每个小时此作业都会运行 6 次。这只是设置了一个上限。 无论 Puppet 经常运行还是会发生其他情况,如果一个小时内已经运行了 6 次就不会再次运行。 如果 Puppet 每天仅执行一次,那么这个作业也仅执行一次。 因此,要确保某事件在特定的时间 不会 发生(或者 不 超过给定的频率),使用 schedule
是最有用的。