25. 作业

一个 作业 是 AWX 启动 Ansible 剧本针对主机库存的实例。

作业 链接显示作业及其状态列表——显示为成功完成或失败,或作为活动(正在运行)作业。默认视图是折叠的(紧凑),其中包含作业名称、状态、作业类型以及开始/结束时间,但您可以展开以查看更多信息。您可以根据各种条件对该列表进行排序,并执行搜索以筛选感兴趣的作业。

Jobs List with Example Jobs

Expanded Jobs List

您可以从此屏幕执行的操作包括查看特定作业的详细信息和标准输出、重新启动 (Launch Action Button) 作业或删除选定作业。重新启动操作仅适用于重新启动剧本运行,不适用于项目/库存更新、系统作业、工作流作业等。

当作业重新启动时,您将在作业运行时被定向到作业输出屏幕。单击任何类型的作业也会将您带到该作业的作业输出视图,您可以在其中根据各种条件筛选作业

Filter options in the Jobs Output window
  • Stdout 选项是显示作业流程和输出的默认显示。

  • 事件 选项允许您根据感兴趣的事件进行过滤,例如错误、主机失败、主机重试、跳过的项目等。您可以根据需要在过滤器中包含多个事件。

Selected filter examples from the Jobs Output window
  • 高级 选项是一个经过改进的搜索,允许您结合包含或排除条件、按键搜索或按查找类型搜索。有关使用搜索的详细信息,请参阅 搜索 章节。

25.1. 库存同步作业

执行库存同步时,完整结果会自动显示在输出选项卡中。这将显示与通过 Ansible 命令行运行时看到的相同信息,并且对于调试很有用。 ANSIBLE_DISPLAY_ARGS_TO_STDOUT 默认情况下对于所有剧本运行都被设置为 False。这与 Ansible 的默认行为一致。这不会在作业详细信息界面中的任务标题中显示任务参数,以避免将某些敏感模块参数泄露到 stdout。如果您希望恢复先前的行为(尽管存在安全隐患),可以通过 AWX_TASK_ENV 配置设置将 ANSIBLE_DISPLAY_ARGS_TO_STDOUT 设置为 True。有关更多详细信息,请参阅 ANSIBLE_DISPLAY_ARGS_TO_STDOUT.

输出选项卡右上角的图标允许您重新启动 (Launch Action Button)、下载 (Download Action Button) 作业输出或删除 (Delete Action Button) 作业。

Example output for a successful Inventory Sync job

注意

可以在相关作业运行时执行库存更新。在您拥有大型项目(约 10 GB)的情况下,/tmp 上的磁盘空间可能是一个问题。

25.1.1. 库存同步详细信息

访问详细信息选项卡以提供有关作业执行的详细信息。

Example details for an Inventory Sync job

执行的作业的显著细节是

  • 状态:可以是以下任何一种

    • 挂起 - 库存同步已创建,但尚未排队或开始。任何作业,不仅仅是库存源同步,都会一直处于挂起状态,直到它真正准备好由系统运行。库存源同步未准备好运行的原因包括:当前正在运行的依赖项(所有依赖项必须在下一步执行之前完成),或者在它配置运行的位置没有足够的容量。

    • 等待 - 库存同步正在排队等待执行。

    • 运行 - 库存同步当前正在进行。

    • 成功 - 库存同步作业成功。

    • 失败 - 库存同步作业失败。

  • 库存:关联的库存组的名称。

  • :云库存的类型。

  • 库存源项目:用作此库存同步作业源的项目。

  • 执行环境:使用的执行环境。

  • 执行节点:用于执行作业的节点。

  • 实例组:与该作业一起使用的实例组的名称(AWX 是默认的实例组)。

通过点击这些项目,您可以在适当的地方查看相应的作业模板、项目和其他对象。

25.2. SCM 库存作业

执行从 SCM 获取的库存时,完整结果会自动显示在输出选项卡中。这将显示与通过 Ansible 命令行运行时看到的相同信息,并且对于调试很有用。输出选项卡右上角的图标允许您重新启动 (Launch Action Button)、下载 (Download Action Button) 作业输出或删除 (Delete Action Button) 作业。

Example output for a successful SCM job

25.2.1. SCM 库存详细信息

访问详细信息选项卡以提供有关作业执行及其关联项目的详细信息。

Example details for an SCM job

执行的作业的显著细节是

  • 状态:可以是以下任何一种

    • 挂起 - SCM 作业已创建,但尚未排队或开始。任何作业,不仅仅是 SCM 作业,都会一直处于挂起状态,直到它真正准备好由系统运行。SCM 作业未准备好运行的原因包括:当前正在运行的依赖项(所有依赖项必须在下一步执行之前完成),或者在它配置运行的位置没有足够的容量。

    • 等待 - SCM 作业正在排队等待执行。

    • 运行 - SCM 作业当前正在进行。

    • 成功 - 上一个 SCM 作业成功。

    • 失败 - 上一个 SCM 作业失败。

  • 作业类型:SCM 作业显示源代码控制更新。

  • 项目:项目的名称。

  • 项目状态:指示关联的项目是否成功更新。

  • 修订版:指示在此作业中使用的源项目的修订版号。

  • 执行环境:指定用于运行此作业的执行环境。

  • 执行节点:指示运行作业的节点。

  • 实例组:指示运行作业的实例组(如果指定)。

  • 作业标签:标签显示执行的各种作业操作。

通过点击这些项目,您可以在适当的地方查看相应的作业模板、项目和其他对象。

25.3. 剧本运行作业

执行剧本时,完整结果会自动显示在输出选项卡中。这将显示与通过 Ansible 命令行运行时看到的相同信息,并且对于调试很有用。

Example output for a successful playbook run

事件摘要捕获了作为此剧本一部分运行的事件的总数

  • 剧本 字段中此剧本运行的次数

  • 任务 字段中与此剧本关联的任务数量

  • 主机 字段中与此剧本关联的主机数量

  • 已用 字段中完成剧本运行所花费的时间

Example summary details for a playbook

事件摘要旁边的图标允许您重新启动 (Launch Action Button)、下载 (Download Action Button) 作业输出或删除 (Delete Action Button) 作业。

主机状态栏横跨输出视图的顶部运行。将鼠标悬停在主机状态栏的一部分上,将显示与该特定状态关联的主机数量。

Show All Host Events

从其作业模板页面的作业选项卡启动作业后,也可以访问 Playbook 作业的输出。

单击输出中的各种行项目任务,可以查看其主机详细信息。

25.3.2. 主机详细信息

主机详细信息对话框显示有关受所选事件影响的主机及其关联 Play 和任务的信息

  • 主机

  • 状态

  • Play 字段中的运行类型

  • 任务类型

  • 如果适用,任务的 Ansible 模块以及该模块的任何参数

Host Events Details

要以 JSON 格式查看结果,请单击JSON选项卡。要查看任务的输出,请单击标准输出。要查看输出中的错误,请单击标准错误

25.3.3. Playbook 运行详细信息

访问详细信息选项卡以提供有关作业执行的详细信息。

Example Job details for a playbook run

执行的作业的显著细节是

  • 状态:可以是以下任何一种

    • 挂起 - Playbook 运行已创建,但尚未排队或启动。任何作业,不仅是 Playbook 运行,都将处于挂起状态,直到它实际上准备好在系统中运行。Playbook 运行未准备好的原因包括当前正在运行的依赖项(所有依赖项必须完成才能执行下一步),或者在其配置的运行位置没有足够的容量。

    • 等待 - Playbook 运行已排队,正在等待执行。

    • 正在运行 - Playbook 运行当前正在进行中。

    • 成功 - 上次 Playbook 运行成功。

    • 失败 - 上次 Playbook 运行失败。

  • 作业模板:从此作业启动的作业模板的名称。

  • 清单:为此作业选择的清单。

  • 项目:与已启动作业关联的项目的名称。

  • 项目状态:与已启动作业关联的项目的状态。

  • Playbook:用于启动此作业的 Playbook。

  • 执行环境:此作业中使用的执行环境的名称。

  • 容器组:此作业中使用的容器组的名称。

  • 凭据:此作业中使用的凭据。

  • 额外的变量:在此处显示创建作业模板时传递的任何额外变量。

通过点击这些项目,您可以在适当的地方查看相应的作业模板、项目和其他对象。

25.4. AWX 容量确定和作业影响

本节介绍如何确定实例组的容量及其对您的作业的影响。对于容器组,请参阅AWX 管理指南中的容器容量限制

AWX 容量系统确定给定实例可用的资源量和正在运行的作业的大小(称为影响),在实例上可以运行多少个作业。用于确定此容量的算法完全基于两件事

  • 系统可用的内存量(mem_capacity

  • 系统可用的 CPU 量(cpu_capacity

容量也会影响实例组。由于组由实例组成,因此同样地,实例可以分配给多个组。这意味着对一个实例的影响可能会影响其他组的总容量。

实例组(而不是实例本身)可以分配给在不同级别(请参阅集群)由作业使用。当任务管理器准备其图表以确定作业将在哪个组上运行时,它将为尚未开始或未准备开始运行的作业提交实例组的容量。

最后,在较小的配置中,如果只有一个实例可供作业运行,则任务管理器将允许该作业在该实例上运行,即使它使实例超过容量。这保证了作业本身不会由于系统容量不足而被卡住。

因此,容量和影响不是作业与实例/实例组相关的零和系统。

有关切片作业及其对容量的影响的信息,请参阅作业切片执行行为

25.4.1. 容量算法的资源确定

定义容量算法是为了确定系统能够同时运行多少个 fork。这控制了 Ansible 本身将同时与多少个系统进行通信。一般而言,增加 AWX 系统运行的 fork 数将通过并行执行更多工作来使作业运行得更快。权衡是这将增加系统负载,这可能会导致工作整体变慢。

AWX 在确定容量时可以使用两种模式。 mem_capacity(默认)将允许您过度使用 CPU 资源,同时保护系统免于内存不足。如果您的大部分工作不是 CPU 密集型,那么选择此模式将最大限度地提高 fork 数。

25.4.1.1. 内存相对容量

mem_capacity 是相对于每个 fork 所需的内存量计算的。考虑到内部组件的开销,这大约是每个 fork 100MB。在考虑可用于 Ansible 作业的内存量时,容量算法将保留 2GB 的内存以考虑其他服务的存在。此算法公式为

(mem - 2048) / mem_per_fork

例如

(4096 - 2048) / 100 == ~20

因此,具有 4GB 内存的系统能够运行 20 个 fork。值 mem_per_fork 可以通过设置设置值(或环境变量)SYSTEM_TASK_FORKS_MEM 来控制,该值默认为 100。

25.4.1.2. CPU 相对容量

通常,Ansible 工作负载可能是相当 CPU 密集型的。在这些情况下,有时减少同时工作负载会使更多任务运行得更快,并减少这些作业的平均完成时间。

mem_capacity 算法使用每个 fork 所需的内存量一样,cpu_capacity 算法查看每个 fork 所需的 CPU 资源量。这方面的基线值为每个核心 4 个 fork。此算法公式为

cpus * fork_per_cpu

例如,一个 4 核系统

4 * 4 == 16

fork_per_cpu 可以通过设置设置值(或环境变量) SYSTEM_TASK_FORKS_CPU 来控制,默认值为 4。

25.4.2. 容量作业影响

选择容量时,了解每种作业类型如何影响容量非常重要。

了解分叉对 Ansible 的意义很有帮助:https://www.ansible.org.cn/blog/ansible-performance-tuning(参见“了解您的分叉”部分)。

Ansible 的默认分叉值为 5。但是,如果 AWX 知道您正在运行的目标系统少于该值,则实际并发值会更低。

运行作业时,AWX 会在选定的分叉数中加 1,以补偿 Ansible 父进程。因此,如果您针对 5 个系统运行一个剧本,分叉值为 5,那么从作业影响的角度来看,实际分叉值为 6。

25.4.2.1. AWX 中作业类型的影響

作业和临时作业遵循上述模型,分叉 + 1。如果您在作业模板上设置了分叉值,您的作业容量值将是提供的分叉值、您拥有的主机数量加一的最小值。加一是用来计算 Ansible 父进程。

实例容量决定哪些作业分配到特定实例。如果作业和临时命令具有更高的分叉值,则它们会使用更多容量。

其他作业类型具有固定影响

  • 清单更新:1

  • 项目更新:1

  • 系统作业:5

如果您在作业模板上没有设置分叉值,您的作业将使用 Ansible 的默认分叉值 5。即使 Ansible 默认使用 5 个分叉,但如果您的作业主机少于 5 个,它将使用更少的分叉。一般来说,设置的分叉值高于系统所能承受的范围,可能会导致内存不足或 CPU 过度使用的问题。因此,您使用的作业模板分叉值应该适合系统。如果您有使用 1000 个分叉的剧本,但您的系统中没有单个系统具有那么大的容量,那么您的系统规模过小,存在性能或资源问题风险。

25.4.2.2. 选择正确的容量

从 CPU 限制或内存限制容量限制中选择一个容量,本质上就是在选择最小或最大分叉数。在上面的例子中,CPU 容量允许最多 16 个分叉,而内存容量允许 20 个分叉。对于某些系统来说,两者之间的差距可能很大,通常您可能希望在这两者之间取得平衡。

实例字段 capacity_adjustment 允许您选择想要考虑的哪一部分。它用 0.0 到 1.0 之间的值表示。如果设置为 1.0,则将使用最大的值。上面的例子涉及内存容量,所以将选择 20 个分叉的值。如果设置为 0.0,则将使用最小的值。值 0.5 代表两种算法的 50/50 平衡,结果为 18。

16 + (20 - 16) * 0.5 == 18

要在用户界面中查看或编辑容量,请选择实例组的实例选项卡。

Instances tab of Instance Group showing sliders for capacity adjustment.

25.5. 作业分支覆盖

项目在 scm_branch 字段中指定要从源代码管理中使用的分支、标签或引用。这些由项目详细信息字段中指定的值表示,如所示。

Create New Project page with SCM branching options emphasized

项目可以选择“允许分支覆盖”。选中后,项目管理员可以将分支选择委托给使用该项目的作业模板(只需要项目 use_role)。

Allow Branch Override checkbox option in Project selected

25.5.1. 源代码树复制行为

每次作业运行都有自己的私有数据目录。该目录包含给定 scm_branch 的项目源代码树副本,该作业正在运行。作业可以自由地对项目文件夹进行更改,并在运行时使用这些更改。该文件夹是临时的,将在作业运行结束时清理。

如果选中清除,AWX 将通过在各自的 Ansible 模块中使用 force 参数来丢弃其存储库本地副本中修改的文件,这些模块与 gitSubversion 相关。

Clean checkbox option in Project selected

25.5.2. 项目修订行为

通常,在项目更新期间,默认分支(在项目的SCM 分支字段中指定)的修订版在更新时会保存,使用该项目的作业将使用此修订版。在作业中提供非默认SCM 分支(不是提交哈希或标签),将在作业开始之前立即从源代码管理远程拉取最新的修订版。此修订版显示在作业的源代码管理修订版字段及其相应的项目更新中。

Project's Source Control Revision value

因此,非默认分支的脱机作业运行是不可能的。要确保作业运行的是源代码管理中的静态版本,请使用标签或提交哈希。项目更新不会保存所有分支的修订版,只保存项目默认分支的修订版。

SCM 分支字段不会进行验证,因此项目必须进行更新以确保其有效性。如果提供了此字段或提示输入此字段,则作业模板的剧本字段将不会进行验证,您必须启动作业模板才能验证预期剧本的存在。

25.5.3. Git Refspec

SCM Refspec 字段指定更新应从远程下载哪些额外的引用。示例如下:

  1. refs/*:refs/remotes/origin/*:获取所有引用,包括远程的远程引用

  2. refs/pull/*:refs/remotes/origin/pull/*(特定于 GitHub):获取所有拉取请求的 ref

  3. refs/pull/62/head:refs/remotes/origin/pull/62/head:获取该 GitHub 拉取请求的 ref

对于大型项目,在使用这里的第一个或第二个示例时,您应该考虑性能影响。

SCM Refspec 参数会影响项目分支的可用性,并可以允许访问否则不可用的引用。上面的示例允许用户从SCM 分支提供拉取请求,如果没有SCM Refspec 字段,这是不可能的。

Ansible git 模块默认获取 refs/heads/*。这意味着如果SCM Refspec 为空,项目的 branches 和 tags(以及其中的提交哈希)可以用作 SCM Branch。SCM Refspec 字段中指定的值会影响哪些SCM Branch 字段可用作覆盖。项目更新(任何类型)将执行额外的 git fetch 命令以从远程拉取该 refspec。

例如:您可以设置一个允许分支覆盖的项目,使用第一个或第二个 refspec 示例 -> 在一个提示SCM 分支的作业模板中使用它 -> 客户端可以在创建新的拉取请求时启动作业模板,提供分支 pull/N/head -> 作业模板将针对提供的 GitGub 拉取请求引用运行。

有关 Ansible git 模块的更多信息,请参见 https://docs.ansible.org.cn/ansible/latest/collections/ansible/builtin/git_module.html