22. 工作流

工作流允许您配置一系列不同的作业模板(或工作流模板),这些模板可能共享或不共享清单、剧本或权限。但是,工作流具有与作业模板类似的“管理员”和“执行”权限。工作流完成将作为单个单元的发布过程的一部分的所有作业的完整集合进行跟踪的任务。

作业或工作流模板使用称为节点的图形结构链接在一起。这些节点可以是作业、项目同步或清单同步。一个模板可以是不同工作流的一部分,或者在同一个工作流中多次使用。当您启动工作流时,图形结构的副本将保存到工作流作业中。

以下示例显示了一个包含所有三个节点以及工作流作业模板的工作流

Workflow Node All Scenarios

随着工作流的运行,作业将从节点的链接模板中生成。链接到具有提示驱动字段(job_typejob_tagsskip_tagslimit)的作业模板的节点可以包含这些字段,并且在启动时不会提示。具有可提示凭据和/或清单但**没有默认值**的作业模板将无法包含在工作流中。

22.1. 工作流场景和注意事项

考虑以下构建工作流的场景

  • 默认情况下,根节点设置为 ALWAYS,并且不可编辑。

Root Node Always
  • 一个节点可以有多个父节点,子节点可以链接到成功、失败或始终的任何状态。如果始终,则状态既不是成功也不是失败。状态应用于节点级别,而不是工作流作业模板级别。除非工作流作业被取消或遇到错误,否则它将被标记为成功。

Sibling Nodes All Edge Types
  • 如果您删除工作流中的作业或工作流模板,则先前连接到这些已删除节点的节点会自动连接到上游,并保留其边缘类型,如下例所示

Node Delete Scenario
  • 您可以拥有一个收敛工作流,其中多个作业收敛为一个。在这种情况下,在下一个作业运行之前,任何作业或所有作业都必须完成,如下例所示

Node Convergence

在提供的示例中,AWX 并行运行前两个作业模板。当它们都按照指定完成并成功时,第 3 个下游(收敛节点)将触发。

  • 清单和调查的提示将应用于工作流作业模板中的工作流节点。

  • 如果您从 API 启动,则运行 get 命令会显示警告列表并突出显示缺少的组件。工作流作业模板的基本工作流如下所示。

Workflow Diagram
  • 可以同时启动多个工作流,并设置启动时间表。您可以为工作流设置通知,例如作业完成时,类似于作业模板。

注意

作业切片旨在水平扩展作业执行。在作业模板上启用作业切片会将要操作的清单划分为在启动时配置的切片数量,然后为每个切片启动一个作业。

预计切片数量将等于或小于控制器节点的数量。设置极高的作业切片数量(例如,数千个),虽然允许,但会导致性能下降,因为作业调度程序并非旨在同时调度数千个工作流节点,而这些节点正是切片作业变成的内容。

  • 您可以构建递归工作流,但是如果 AWX 检测到错误,它将在嵌套工作流尝试运行时停止。

  • 子工作流中作业收集的工件将传递到下游节点。

  • 清单可以在工作流级别设置,或在启动时提示输入清单。

  • 启动时,工作流中所有具有 ask_inventory_on_launch=true 的作业模板都将使用工作流级别清单。

  • 不提示输入清单的作业模板将忽略工作流清单并针对其自己的清单运行。

  • 如果工作流提示输入清单,则计划和其他工作流节点可能会提供清单。

  • 在工作流收敛场景中,set_stats 数据将以未定义的方式合并,因此建议您设置唯一的键。

22.2. 附加变量

与作业模板类似,工作流使用调查来指定要在工作流中的剧本中使用的变量,称为 extra_vars。调查变量与工作流作业模板上定义的 extra_vars 相结合,并保存到工作流作业 extra_vars 中。工作流作业中的 extra_vars 在工作流中生成作业时与作业模板变量相结合。

工作流利用与作业模板相同的变量优先级行为(层次结构),除了三个附加变量。请参阅本指南“作业模板”章节的附加变量部分中的变量优先级层次结构。三个附加变量包括

Variable Precedence Hierarchy

包含在工作流中的工作流将遵循相同的变量优先级 - 它们只有在明确提示或定义为调查的一部分时才会继承变量。

除了工作流 extra_vars 之外,作为工作流一部分运行的作业和工作流可以继承工作流中父作业的工件字典中的变量(也与上游分支中的祖先结合)。这些可以通过 set_stats Ansible 模块 定义。

如果您在剧本中使用 set_stats 模块,则可以生成可以被下游另一个作业使用的结果,例如,通知用户集成运行的成功或失败。在此示例中,有两个可以组合在工作流中以练习工件传递的剧本

  • **invoke_set_stats.yml**: 工作流中的第一个剧本

---
- hosts: localhost
  tasks:
    - name: "Artifact integration test results to the web"
      local_action: 'shell curl -F "file=@integration_results.txt" https://file.io'
      register: result

    - name: "Artifact URL of test results to Workflows"
      set_stats:
        data:
          integration_results_url:  "{{ (result.stdout|from_json).link }}"
  • **use_set_stats.yml**: 工作流中的第二个剧本

---
- hosts: localhost
  tasks:
    - name: "Get test results from the web"
      uri:
        url: "{{ integration_results_url }}"
        return_content: true
      register: results

    - name: "Output test results"
      debug:
        msg: "{{ results.content }}"

set_stats 模块按以下方式处理此工作流

  1. 集成结果的内容(例如,下面的 integration_results.txt)首先上传到 Web。

the tests are passing!
  1. 通过 **invoke_set_stats** 剧本,然后调用 set_stats 将上传的 integration_results.txt 的 URL 作为工件放入 Ansible 变量“integration_results_url”中。

  2. 工作流中的第二个剧本使用 Ansible 附加变量“integration_results_url”。它使用 uri 模块调用 Web 以获取先前作业模板作业上传的文件内容。然后,它只是打印出获取的文件的内容。

注意

为了使工件工作,请保留默认设置,在 set_stats 模块中 per_host = False

22.3. 工作流状态

工作流作业可以具有以下状态(没有失败状态)

  • 等待

  • 运行

  • 成功(已完成)

  • 取消

  • 错误

  • 失败

在工作流方案中,取消作业会取消分支,而取消工作流作业会取消整个工作流。

22.4. 基于角色的访问控制

要编辑和删除工作流作业模板,您必须具有管理员角色。要创建工作流作业模板,您必须是组织管理员或系统管理员。但是,您可以运行包含您没有权限的作业模板的工作流作业模板。与项目类似,组织管理员可以创建一个空白工作流,然后向低级用户授予“admin_role”,之后他们可以开始委派更多访问权限并构建图形。您必须对作业模板具有执行访问权限才能将其添加到工作流作业模板中。

根据授予特定用户的权限,还可以执行其他任务,例如创建副本和重新启动工作流。通常,在重新启动或创建副本之前,您应该拥有对工作流中使用的所有资源(如作业模板)的权限。

有关执行本节中描述的任务的更多信息,请参阅管理指南