sliced job 是指分布式作业的概念。分布式作业用于在大量主机中运行一个作业,允许您运行多个 ansible-playbook,各自针对清单的一个子集,并且可在集群中并行调度。
默认情况下,Ansible 从一个单一的控制实例中运行作业。对于不需要跨主机编配的作业,作业分片可以利用 Tower 在一个集群中的多个节点中分配工作的功能。作业分片会添加作业模板字段 job_slice_count
来指定 Ansible 运行要分片的作业数量。当这个数字大于 1 时,Tower 会从作业模板而非作业生成工作流。清单将平均分布在分片作业中。然后,工作流作业启动,并像正常的工作流一样继续运行。启动作业时,API 将返回作业资源(如果 job_slice_count = 1
)或工作流作业资源。相应的 Tower 用户界面会重定向到适当的屏幕以显示运行状态。
设置作业分片时请考虑以下几点:
分片作业会创建一个工作流作业,然后创建作业。
作业分片由作业模板、清单和分片计数组成。
执行时,分片作业会将每个清单分成多个“分片大小”的块。然后,它会在相应清单的每个块上为 ansible-playbook 运行作业排队。馈入到 ansible-playbook 的清单是一个削减版本,它只包含该特定分片中的主机。作业列表中显示的已完成的分片作业会进行相应标记,包含已运行的分片作业数量:
这些分片作业遵循常规调度行为(fork 数量,根据容量进行排队,根据清单映射分配给实例组)。
带有提示和/或额外变量的分片作业模板与标准作业模板的行为相同,在生成的工作流作业中向整个分片作业集应用所有变量和限制。但是,在将限制传递给分片作业时,如果限制导致分片没有分配的主机,则这些分片将失败,从而导致整个作业失败。
分布式作业的作业分片作业状态与工作流作业的计算方式相同;如果其子作业中有未处理的故障,则为失败状态。
警告
任何计划在多个主机间编配(而不是只对单个主机应用更改)的作业都不应该被配置为分片作业。否则,任何作业都可能失败,Tower 也不会试图发现或考虑作为分片作业运行时失败的 playbook。
当作业被分片时,它们可以在任何 Tower 节点上运行,有些则可能不会同时运行(例如,系统中的容量不足)。当分片作业运行时,作业详情会显示当前运行的工作流和作业分片,以及用于单独查看其详情的链接。
默认情况下,作业模板通常不会被配置为同时执行(必须在 API 中或 UI 中的 Enable Concurrent Jobs 中检查 allow_simultaneous
)。分片操作会覆盖此行为并使用 allow_simultaneous
,即使未选中此设置也是如此。如需了解如何指定此设置的信息,以及作业模板配置中的作业分片数量,请参阅 作业模板。
作业模板 部分提供了在 Tower 用户界面中执行以下操作的更多详情:
使用包括分片数量大于一的作业模板启动工作流作业
启动分片作业模板后取消整个工作流或单独的作业
在分片完成运行后重新启动整个工作流或单独的作业
在启动作业模板后查看工作流和作业的详情
在创建分片作业后专门搜索它们(请参阅后续 搜索作业分片 部分)
要更方便地查找分片作业,请使用搜索功能将搜索过滤器应用到:
作业列表仅显示分片作业
作业列表仅显示作业分片的父工作流
作业模板列表仅显示生成分片作业的作业模板
如果只需要显示作业列表中的分片作业,如同大多数情况一样,您可以根据类型(此处的作业)或 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