Saltstack原生提供schedule模块来完成计划任务的功能,基于State完成额定的定时执行的任务,本文将就此展开讲述。


Salt本身提供多方面的Scheduler的配置,可以从Master 配置端、Master Pillar端、Minion配置端或Minion.d下的配置文件下配置定期计划任务。


Pillar Scheduler

由于配置在Master Pillar端具有良好的灵活性的优势,鄙人推荐使用这种方式去完成计划任务的设定。好了,话不多说,切入正题。


Pillar允许配置Scheduler应该是0.16.x以上的版本所具备的功能,具体添加的代码如下:


+        # Merge the pillar's schedule dict with our minion's
+        # configuration before passing that configuration on
+        # to the schedule.
+        schedule_opts = {}
+        if 'schedule' in self.opts['pillar']:
+            schedule_opts.update(self.opts['pillar']['schedule'])
+        if 'schedule' in self.opts:
+            schedule_opts.update(self.opts['schedule'])
+        opts = dict(self.opts)
+        opts['schedule'] = schedule_opts


而Pillar Scheduler的配置其实大同小异,最终实现的效果便是Master获取到对应的配置数据然后分发到对应的Minion端。首先在/srv/pillar/top.sls中包含schedule:


base:  
  "*"
    - schedule


之后,在/srv/pillar/schedule.sls里写入具体的Schedule配置,例如:


schedule:
  highstate:
    function: state.highstate
    minutes: 10

  testcase:
    function: cmd.run
    seconds: 5
    args:
      - 'echo 1 >> /tmp/test.cmd.log'
    kwargs:
      stateful: False


在完成上述动作后,便完成了计划任务的创建,但是想要推送到minion端使其按计划执行则还需要执行一条命令:salt '*' saltutil.refresh_pillar


想要获取当前的schedule job,可以使用salt '*' pillar.get schedulesalt '*' config.option schedule来确定。有点遗憾的是,暂时没完全搞懂maxrunning参数是什么意思。.


Minion.d Conf Scheduler

当然也可以直接在minion端配置schedule,方法类似,只需要在minion.d下创建一个scheduler.conf文件,里面填入同样对 应的schedule信息即可。


不过这种方法必须要直接的“告知minion重新载入配置”,当前已知的方式便是重启Minion service,所以存在一些运维负担。注意,这样的Scheduler配置只能通过salt '*' config.option schedule来检索。


Scheduler management

目前salt应该是只提供了schedule的配置,至于如何查看schedule job的完成情况以及如何管理,除了设置returner的方式,鄙人暂时不知道有啥参数可以管理、设置。查看官方issue,应该后期版本会加入schedule job的管理模块~