调度

稍后运行表单或按 cron 调度运行,以及管理所有调度

  1. 表单操作
  2. 调度表单
  3. 调度页面
  4. Cron 表达式和时区
  5. 调度如何运行
  6. 计划的运行
  7. 表单发生变化时
  8. 作业历史中的调度作业

表单操作

表单不只能立即运行:其提交按钮旁边的下拉菜单中还有另外三个操作。

操作 作用 角色选项
调度(周期性) 创建一个按 cron 表达式运行表单的调度 allowScheduledJobs
稍后运行(一次性) 创建一个在您选定的日期和时间运行一次表单的调度 allowPlannedJobs
保存 保存字段值,以便以后再次加载到表单中 allowStoredJobs

角色选项关闭的操作不会显示。执行任何这些操作之前,表单都会像提交时一样进行验证。两种 调度操作都会在调度页面上创建一个条目;保存会在保存的作业页面上创建一个条目。 作业页面的侧栏在未来下以已计划和已保存打开它们。这些角色选项的说明 见角色选项。

请把 allowScheduledJobs 视为管理员级别的选项。其调度不归创建它们的用户所有:每个拥有 该选项的用户都能看到并修改所有调度。这样的调度还会以管理员权限运行任何表单,无论 创建者自己的访问权限如何。只把它授予您会像信任管理员一样信任的角色。

稍后运行(一次性) 只需要 allowPlannedJobs 。对于没有 allowScheduledJobs 的用户,它会以该 用户身份计划一次运行:服务器检查该用户是否可以运行该表单,到时间时作业以该用户身份运行,并归其所有 (参见计划的运行)。


调度表单

填写表单,然后打开提交旁边的下拉菜单,选择其中一个调度操作。

  • 调度(周期性) 会打开创建调度:输入名称和 Cron 表达式(默认值 0 0 * * * 表示每天午夜运行),然后选择创建调度。
  • 稍后运行(一次性) 会打开稍后运行:输入名称并选择运行时间的日期和时间,然后选择 调度作业。

名称在所有调度中必须唯一。调度会保存表单的名称,以及表单在那一刻生成的 extravars 的副本, 以 YAML 格式写入;每次运行都使用该副本,因此要更改作业收到的内容,请在调度页面上编辑它。

调度


调度页面

调度页面列出所有调度,从 7.3.0 起带有已启用列,需要 allowScheduledJobs 。每一行的菜单提供:

操作 作用
编辑 修改名称、类型、cron 表达式或运行时间、表单以及 extra vars
立即运行 立即运行该调度,不等待其 cron 表达式或运行时间
启用或禁用 根据已启用列的状态,打开或关闭该调度(从 7.3.0 起)
删除 移除该调度;它会立即停止运行
最近输出 在调度页面上显示最近一次运行报告的内容,例如它启动的作业编号

也可以在这里从头创建调度。选择表单,然后勾选一次性运行并设置 运行时间,或者不勾选并设置 Cron 调度。Extra vars 是 YAML,没有表单来填写它,因此请自行添加 playbook 需要的值,以字典(键: 值对)的形式。

Cron 调度字段是一个 cron 编辑器:它会用文字描述表达式,提供预设,并预览接下来的 几次运行。服务器会拒绝它无法运行的表达式,或者永远不会发生的表达式。

从 7.3.0 起,每个调度都有一个已启用开关,可以暂停调度而无需删除它。关闭的调度仍保留在页面上, 其设置不变,但不会自行运行:周期性调度会跳过其 cron 触发点,一次性调度则会越过其 运行时间一直等待,直到再次打开。立即运行仍然可以按需运行它。新的调度默认开启,7.3.0 之前 已存在的调度在升级后也处于开启状态。


Cron 表达式和时区

周期性调度使用标准的 5 字段 cron 表达式:分钟、小时、月中的日、月份和星期。

表达式 运行时间
*/15 * * * * 每 15 分钟
0 2 * * * 每天 02:00
30 7 * * 1-5 周一至周五 07:30
0 0 1 * * 每月第一天的午夜

更多示例,以及编辑器不接受的 cron 功能,请参阅常见问题中的 我可以使用哪些 cron 表达式?。

Cron 调度按服务器的时区运行,该时区由 LOG_TZ 设置(默认 UTC ), 而不是您的个人资料或浏览器的时区。cron 编辑器也按同一时区预览接下来的运行。


调度如何运行

调度到期时会进入队列,服务器每 10 秒检查一次队列,并逐个启动排队的调度。

  • 周期性调度在上一次运行仍在排队或运行时会跳过当次触发,因此各次运行永远不会重叠。
  • 一次性调度在运行时间之后一分钟内运行,然后被删除,通过立即运行启动时也是如此。
  • 状态在作业已启动时为 success ,无法启动时为 failed 。 success 只表示作业已 运行:请打开作业查看其最终结果。

用 allowScheduledJobs 创建的调度以内置用户 Schedule Service (类型 schedule )运行,拥有 admin 角色。它可以运行任何表单,无论创建调度的人有何访问权限,其 extravars 中的 ansibleforms_user 描述的就是该用户。而计划的运行则以计划它的用户身份运行。

作业还会得到一个 schedule 对象(包含其 id 、 name 和 form ),这样 playbook 就知道是调度启动了它:

schedule:
  id: 3
  name: Nightly cleanup
  form: Cleanup servers

计划的运行

没有 allowScheduledJobs 的用户使用稍后运行(一次性) 时,会创建一个计划的运行:一个与该用户绑定的一次性调度。

  • 计划时,服务器会检查该用户是否可以运行该表单(其 roles ),详细模式需要 allowVerboseMode 。计划的运行始终是一次性的;cron 表达式会被拒绝。
  • 在运行验证为 enforce 时,字段值会在计划时检查,因此本会被拒绝的运行会在 用户还在查看时就被拒绝。
  • 运行时,作业以该用户身份运行并归其所有,经过与从浏览器运行相同的检查: 当时的表单角色、去除保留的 extravars,以及运行验证。 ansibleforms_user 描述的就是该用户。

计划者看不到调度页面,因为它需要 allowScheduledJobs ;作业会出现在他们自己的作业历史中。


表单发生变化时

调度按名称引用其表单,并在每次运行时按表单当时的定义运行。

  • 表单被编辑:下一次运行使用新的定义(playbook、模板、清单)以及调度中保存的 extravars。表单不会被渲染,因此不会重新计算任何字段;请编辑调度的 extra vars 使其匹配。
  • 表单被重命名或移除:运行失败,状态变为 failed ,最近输出显示 Failed to launch : No such form '<name>' 。请编辑调度并选择正确的表单,或者删除它。

作业历史中的调度作业

调度的每次运行都会创建一个普通作业,列在作业页面上,其用户为 Schedule Service ; 如果是计划的运行,则为计划它的用户。

Schedule Service 作业不属于创建调度的人,因此只有管理员和 拥有 showAllJobLogs 的用户才能看到;计划的运行所产生的作业,其用户也能看到。调度的最近输出会指出它启动的作业,方便您在列表中找到它。