多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 使用日程表资源 使用启用了 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 是最有用的。