简介
======================

本节介绍使用 Takler 的基本步骤。

编写工作流定义
----------------------

工作流定义描述如何运行任务并与其进行交互。
*Task* 可以组成 *NodeContainer*，*NodeContainer* 可以属于另外的 *NodeContainer* 或属于 *Flow*。
所有的实体 (Task, NodeContainer, Flow) 都叫做 *Node*，构成一个层次树。

Takler 使用 Python 编写工作流定义。

编写任务脚本
------------------

Takler 中的每个 Shell 脚本任务都对应一个 takler 脚本文件。
脚本定义任务需要执行的主要工作，包含子命令 (child command) 调用、模板特殊命令等。
当前 Takler 的 Shell 脚本任务仅支持 Jinja2 模板格式。

子命令 (child command) 是 *takler_client* 的命令子集，实现与 Takler 服务的通讯。
这些命令通知服务某任务已经开始，完成，出错，或设置某些事件 (event、meter 等)。

运行 Takler 服务
-------------------

启动 Takler 服务后：

* Takler 服务开始调度工作流 (flow)
* 每隔一段时间 (默认情况下为 10 秒)，调度器会检查工作流中每个任务的依赖关系。
  如果满足依赖关系，服务会提交该任务 (task)。
  这个过程被称为作业生成 (job creation)。任务对应的运行过程被称为作业 (job)。

运行中的作业使用子命令 (child command) 与服务通信，会导致：

- 服务中保存的节点 (node) 状态 (NodeStatus) 改变
- 更新节点的树形，比如事件 (event)，标尺 (meter)

使用 CLI 交互
---------------------------

使用 Takler 的命令行工具 *takler_client* 可以查询工作运行状态并控制工作流：

- 查询工作流状态 (show)
- 改变节点状态 (force)
- 控制工作流 (requeue, suspend, resume, run)
