使用日程表资源

使用启用了 schedule 参数的资源,你可以控制当前资源何时被应用。 例如,你希望如下的 exec 资源每天应用一次,将资源参数 schedule 设置成了内置的值 daily:

exec { "/usr/bin/apt-get update":
    schedule => daily,
}

遗憾的是,给 schedule 参数指定 daily 并不能保证该资源每天都能应用一次。 内置的 daily 仅能限制 exec 资源在一天之内不能被应用多余一次, 但是资源是否被应用以及何时被应用完全取决于 Puppet 是否运行以及何时运行。

正因为如此,使用 schedule 资源才是安排执行其他资源的最佳选择。例如, 你可能想要确保 apt-get update 一小时内运行不超过一次; 或者确保一项维护工作在白天生产时间期间不被执行。

为此,你需要创建自己的 schedule 资源。

操作步骤

  1. 添加如下代码到你的配置清单:

    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",
    }
    
  2. 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 是最有用的。