文档

18. 工作流

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

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

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

_images/wf-node-all-scenarios-wf-in-wf.png

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

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

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

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

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

_images/wf-sibling-nodes-all-edge-types.png
  • 如果您删除工作流中的作业或工作流模板,先前连接到这些已删除模板的节点将自动连接到上游,并保留其边缘类型,如下面的示例所示

_images/wf-node-delete-scenario.png
  • 您可以创建一个收敛工作流,其中多个作业收敛到一个作业。在这种情况下,任何作业或所有作业都必须在下一个作业运行之前完成,如下面的示例所示

    _images/wf-node-convergence.png

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

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

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

_images/workflow-diagram.png
  • 可以同时启动多个工作流,并设置启动时间表。您可以在工作流上设置通知,例如作业完成时,类似于作业模板。

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

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

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

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

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

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

  • 在工作流收敛情况下,set_stats 数据将以未定义的方式合并,因此建议您设置唯一的密钥。

18.2. 额外变量

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

工作流使用与作业模板相同的变量优先级行为(层次结构),但有三个额外的变量。有关 Ansible Tower 变量优先级层次结构,请参阅本指南的作业模板章节的 额外变量 部分。这三个额外的变量包括

_images/Architecture-Tower_Variable_Precedence_Hierarchy-Workflows.png

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

除了工作流 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 Tower 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)首先上传到网络。

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

  2. 工作流中的第二个剧本使用 Ansible 额外变量“integration_results_url”。它使用 uri 模块调用网络以获取先前作业模板作业上传的文件内容。然后,它简单地打印出获取的文件内容。

注意

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

18.3. 工作流状态

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

  • 等待

  • 正在运行

  • 成功(已完成)

  • 取消

  • 错误

  • 失败

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

18.4. 基于角色的访问控制

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

其他任务,例如复制副本和重新启动工作流的能力,也可以执行,具体取决于授予特定用户的权限类型。通常,您应该对工作流中使用到的所有资源(如作业模板)具有权限,然后才能重新启动或复制。

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