Documentation

21. 任务分片

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

默认情况下,Ansible 从一个单一的控制实例中运行作业。对于不需要跨主机编配的作业,作业分片可以利用 automation controller 在一个集群中的多个节点中分配工作的功能。作业分片会添加作业模板字段 job_slice_count 来指定 Ansible 运行要分片的作业数量。当这个数字大于 1 时,automation controller 会从作业模板而非作业生成工作流。清单将平均分布在分片作业中。然后,工作流作业启动,并像正常的工作流一样继续运行。启动作业时,API 将返回作业资源(如果 job_slice_count = 1)或工作流作业资源。相应的 Tower 用户界面会重定向到适当的屏幕以显示运行状态。

21.1. 作业分片注意事项

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

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

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

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

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

注解

作业分片旨在对作业的执行镜像水平扩展。在作业模板中启用作业分片,在启动时会将清单划分为配置的分片数量,然后为每个分片启动作业。

预计的分片数量应等于或小于控制器节点的数量。虽然可以设置非常高的作业分片数量(例如,数千个),但可能会导致性能降低。因为工作负载调度程序并不是针对同时调度数千个工作流程节点而设计的,但对作业进行大量分片会造成这个情况。

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

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

警告

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

21.2. 作业分片执行行为

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

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

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

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

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

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

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

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

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

21.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