Documentation

18. 工作流

利用工作流,您可以配置一个由不同作业模板(或工作流模板)组成的序列,它们可能会也可能不会共享清单、playbook 或权限。但是,工作流具有“admin”和“execute”权限,类似于作业模板。工作流完成的任务是将属于发布过程一部分的完整作业集合作为一个单元来跟踪。

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

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

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

当工作流运行时,作业会从节点的链接模板生成。如果节点链接至的作业模板具有提示型字段(job_typejob_tagsskip_tagslimit),则节点可以包含这些字段,且不会在启动时提示。具有可提示凭证和/或清单的作业模板没有默认值,将无法包含在工作流中。

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

假设以下构建工作流的场景:

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

_images/wf-root-node-always.png
  • 节点可以有多个父对象,子对象可以与 success、failure 或 always 中的任何状态相连。如果为 always,则状态既不是 success,也不是 failure。状态应用到节点级别,而非工作流工作模板级别。除非工作流作业被取消或遇到错误,否则会被标记为成功。

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

_images/wf-node-delete-scenario.png
  • 您可以有一个聚合的工作流,其中包括多个聚合在一起的作业。在这种情况下,任何作业或所有作业都必须在下一个运行前完成。如下例所示:

    _images/wf-node-convergence.png

在提供的示例中,Tower 会并行运行前两个作业模板。当它们都成功完成,位于下游的第 3 个(convergence node)将触发。

  • 库存和问卷调查提示将应用到工作流作业模板中的工作流节点。

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

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

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

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

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

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

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

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

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

18.2. 额外变量

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

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

_images/Architecture-Tower_Variable_Precedence_Hierarchy-Workflows.png

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

除了工作流 extra_vars 外,作为工作流的一部分运行的作业和工作流还可继承工作流中的父作业工件字典中的变量(也与分支中上游的深一层祖先合并)。这些变量可由 set_stats Ansible module 定义。

如果在 playbook 中使用 set_stats 模块,您可以生成可供下游其他作业使用的结果,例如,通知用户集成运行是成功还是失败。在本例中,工作流中有两个 playbook 可以合并起来执行工件传递:

  • invoke_set_stats.yml:工作流中的第一个 playbook:

---
- 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:工作流中的第二个 playbook

---
- 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 playbook,调用 set_stats 以将上传的 integration_results.txt 的 URL 打包到 Ansible 变量“integration_results_url”中。

  2. 工作流中的第二个 playbook 会使用 Ansible 额外变量“integration_results_url”。它会使用 uri 模块调出 Web 来获取由以前的作业模板作业上传的文件内容。然后,它即会输出 gotten 文件的内容。

_images/wf-templates_set_stats.png

注解

要使工件正常工作,请保留 set_stats 模块中的默认设置 per_host = False

18.3. 工作流状态

工作流可以具有以下状态(无“Failed”状态):

  • Waiting

  • Running

  • Success (finished)

  • Cancel

  • 错误

  • Failed

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

18.4. 基于角色的访问控制

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

也可以执行其他任务,比如复制副本和重新启动工作流,具体取决于为特定用户授予哪几种权限。通常,在重新启动或复制之前,您应该具有对工作流中所有资源(如作业模板)的权限。

有关执行本部分所述任务的更多信息,请参阅 Ansible Tower Administration Guide