Documentation

17. 任务分片

sliced job 是指分布式作业的概念。分布式作业用于在大量主机中运行一个作业,允许您运行多个 ansible-playbook,各自针对清单的一个子集,并且可在集群中并行调度。

默认情况下,Ansible 从单个控制实例运行作业。在 Ansible Tower 3.4 之前,单个 Tower 作业只能作为单个 ansible-playbook 运行,这不能充分利用 Tower 的功能来向集群中的多个节点分发工作。

对于不需要跨主机编配的作业,作业分片可以解决这个问题。作业分片的原理是添加作业模板字段 job_slice_count,指定 Ansible 运行要分片成的作业数量。当这个数字大于 1 时,Tower 会从作业模板而非作业生成工作流。清单将平均分布在分片作业中。然后,工作流作业启动,并像正常的工作流一样继续运行。启动作业时,API 将返回作业资源(如果 job_slice_count = 1)或工作流作业资源。相应的 Tower 用户界面会重定向到适当的屏幕以显示运行状态。

17.1. 作业分片注意事项

设置作业分片时请考虑以下几点:

  • 分片作业会创建一个工作流作业,然后创建作业。

  • 作业分片由作业模板、清单和分片计数组成。

  • 执行时,分片作业会将每个清单分成多个“分片大小”的块。然后,它会在相应清单的每个块上为 ansible-playbook 运行作业排队。馈入到 ansible-playbook 的清单是一个削减版本,它只包含该特定分片中的主机。作业列表中显示的已完成的分片作业会进行相应标记,包含已运行的分片作业数量:

_images/sliced-job-shown-jobs-list-view.png
  • 这些分片作业遵循常规调度行为(fork 数量,根据容量进行排队,根据清单映射分配给实例组)。

  • 带有提示和/或额外变量的分片作业模板与标准作业模板的行为相同,在生成的工作流作业中向整个分片作业集应用所有变量和限制。但是,在将限制传递给分片作业时,如果限制导致分片没有分配的主机,则这些分片将失败,从而导致整个作业失败。

  • 分布式作业的作业分片作业状态与工作流作业的计算方式相同;如果其子作业中有未处理的故障,则为失败状态。

警告

任何计划在多个主机间编配(而不是只对单个主机应用更改)的作业都不应该被配置为分片作业。否则,任何作业都可能失败,Tower 也不会试图发现或考虑作为分片作业运行时失败的 playbook。

17.2. 作业分片执行行为

当作业被分片时,它们可以在任何 Tower 节点上运行,有些则可能不会同时运行(例如,系统中的容量不足)。当分片作业运行时,作业详情会显示当前运行的工作流和作业分片,以及用于单独查看其详情的链接。

_images/sliced-job-shown-jobs-output-view.png

默认情况下,作业模板通常不会被配置为同时执行(必须在 API 中或 UI 中的 Enable Concurrent Jobs 中检查 allow_simultaneous)。分片操作会覆盖此行为并使用 allow_simultaneous,即使未选中此设置也是如此。如需了解如何指定此设置的信息,以及作业模板配置中的作业分片数量,请参阅 作业模板

作业模板 部分提供了在 Tower 用户界面中执行以下操作的更多详情:

  • 使用包括分片数量大于一的作业模板启动工作流作业

  • 启动分片作业模板后取消整个工作流或单独的作业

  • 在分片完成运行后重新启动整个工作流或单独的作业

  • 在启动作业模板后查看工作流和作业的详情

  • 在创建分片作业后专门搜索它们(请参阅后续 搜索作业分片 部分)

17.3. 搜索作业分片

要更方便地查找分片作业,请使用搜索功能将搜索过滤器应用到:

  • 作业列表仅显示分片作业

  • 作业列表仅显示作业分片的父工作流

  • 作业模板列表仅显示生成分片作业的作业模板

如果只需要显示作业列表中的分片作业,如同大多数情况一样,您可以根据类型(此处的作业)或 unified_jobs 进行过滤:

/api/v2/jobs/?job_slice_count__gt=1

仅显示作业分片的父工作流作业:

/api/v2/workflow_jobs/?job_template__isnull=false

仅显示生成分片作业的作业模板:

/api/v2/job_templates/?job_slice_count__gt=1