StackStorm介绍

StackStorm是一个强大的自动化平台,结合DevOps和ChatOps,提供可扩展、灵活和健壮的工具链用于应用、服务和工作流的自动化能力。

Mistral

Mistral是Mirantis公司为Openstack开发的工作流组件,提供Workflow as aService。Stackstorm集成了Mistral,提供更加灵活和强大的Workflow支持。

Mistral的一些概念,需要和StackStrom的概念区分开来:

  • Workbook:工作簿。可以理解为工作流任务的文档,纪录了工作流,任务以及任务的执行顺序,依赖关系,以及每个任务的输入输出等。从开发者的角度看,可以认为它是一种工作流任务的文档组织形式,或者命名空间。
  • Workflow:工作流。比Workbook小的单元。描述了任务,动作的执行顺序,依赖关系。一个Workbook可以有多条Workflow,也可以只有一条Workflow。
  • Task:描述Workflow中包含的工作步骤。
  • Action:Mistral中最小的单位,描述了某一个具体的动作,比如执行一个http请求,或者发一个e-mail等等。

YAQL & Jinja

Mistral中支持的模板解析语法有YAQL和Jinja,这提供了强大的流程控制和语法支持。下面对比下YAQL和Jinja:

YAQL:

version: '2.0'

examples.mistral-branching:

description: >

A sample workflow that demonstrates how to use conditions

to determine which path in the workflow to take.

type: direct

input:

- which

tasks:

t1:

action: core.local

input:

cmd: "printf <% $.which %>"

publish:

path: <% task(t1).result.stdout %>

on-success:

- a: <% $.path = 'a' %>

- b: <% $.path = 'b' %>

- c: <% not $.path in list(a, b) %>

a:

action: core.local

input:

cmd: "echo 'Took path A.'"

publish:

stdout: <% task(a).result.stdout %>

b:

action: core.local

input:

cmd: "echo 'Took path B.'"

publish:

stdout: <% task(b).result.stdout %>

c:

action: core.local

input:

cmd: "echo 'Took path C.'"

publish:

stdout: <% task(c).result.stdout %>

Jinja

version: '2.0'

examples.mistral-jinja-branching:

description: >

A sample workflow that demonstrates how to use conditions

to determine which path in the workflow to take.

type: direct

input:

- which

tasks:

t1:

action: core.local

input:

cmd: "echo {{ _.which }}"

publish:

path: "{{ task('t1').result.stdout }}"

on-success:

- a: "{{ _.path == 'a' }}"

- b: "{{ _.path == 'b' }}"

- c: "{{ not _.path in ['a', 'b'] }}"

a:

action: core.local

input:

cmd: "echo 'Took path A.'"

b:

action: core.local

input:

cmd: "echo 'Took path B.'"

c:

action: core.local

input:

cmd: "echo 'Took path C.'"

Mistral示例

StackStorm的examples下面提供了关于Mistral的示例,我们接下来通过一系列的示例来说明Mistral。

examples.mistral-basic

同样的MistralWorkflow跟ActionChainWorkflow一样都需要提供元数据文件和规格文件,

Pack examples的元数据文件是在/opt/stackstorm/packs/examples/actions目录下,规格文件是在/opt/stackstorm/packs/examples/actions/workflows目录下.

/opt/stackstorm/packs/examples/actions/mistral-basic.yaml

---

description: Run a local linux command

enabled: true

runner_type: mistral-v2

entry_point: workflows/mistral-basic.yaml

name: mistral-basic

pack: examples

parameters:

cmd:

required: true

type: string

timeout:

type: integer

default: 60

规格文件/opt/stackstorm/packs/examples/actions/workflows/mistral-basic.yaml

version: '2.0'

examples.mistral-basic:

description: A basic workflow that runs an arbitrary linux command.

type: direct

input:

- cmd

- timeout

output:

stdout: <% $.stdout %>

tasks:

task1:

action: core.local cmd=<% $.cmd %> timeout=<% $.timeout %>

publish:

stdout: <% task(task1).result.stdout %>

stderr: <% task(task1).result.stderr %>

根据定义examples.mistral-basic需要提供参数cmd(必选)和timeout(可选),然后在task1中调用core.local执行,并且打印执行结果。执行如下:

$ st2 run examples.mistral-basic cmd="date"

.

id: 5afba6ed2b2556015687cdda

action.ref: examples.mistral-basic

parameters:

cmd: date

status: succeeded

result_task: task1

result:

failed: false

return_code: 0

stderr: ''

stdout: Wed May 16 03:35:10 UTC 2018

succeeded: true

start_timestamp: Wed, 16 May 2018 03:35:09 UTC

end_timestamp: Wed, 16 May 2018 03:35:11 UTC

+--------------------------+------------------------+-------+------------+-------------------------------+

| id                       | status                 | task  | action     | start_timestamp               |

+--------------------------+------------------------+-------+------------+-------------------------------+

| 5afba6ee2b2556015687cddd | succeeded (0s elapsed) | task1 | core.local | Wed, 16 May 2018 03:35:10 UTC |

+--------------------------+------------------------+-------+------------+-------------------------------+

examples. mistral-workbook-basic

Mistral中有个WorkBook的概念,是Workflow的组合,也就是说可以同时定义多个Workflow

/opt/stackstorm/packs/examples/actions/workflows/mistral-workbook-multiple-subflows.yaml

version: "2.0"

name: "examples.mistral-workbook-multiple-subflows"

workflows:

main:

type: direct

output:

report: <% $.report %>

state: <% $.state %>

tasks:

call_internal_workflow:

workflow: wf1

input:

v1: ok

publish:

report: <% task(call_internal_workflow).result.report %>

on-success:

- call_internal_workflow_multiple_tasks

call_internal_workflow_multiple_tasks:

workflow: wf2

input:

v1: good

v2: excellent

on-success:

- call_external_workflow

call_external_workflow:

action: examples.mistral-basic

input:

cmd: "echo 'external workflow ok'"

publish:

state: <% task(call_external_workflow).result.stdout %>

on-success:

- call_action_chain

call_action_chain:

action: examples.echochain

wf1:

type: direct

input:

- v1

output:

report: <% $.report %>

tasks:

t1:

action: core.local

input:

cmd: "echo 'task1 <% $.v1 %>'; sleep 1"

publish:

report: <% task(t1).result.stdout %>

wf2:

type: direct

input:

- v1

- v2

tasks:

t1:

action: core.local

input:

cmd: "echo 'task2 <% $.v1 %>'; sleep 1"

t2:

action: core.local

input:

cmd: "echo 'task3 <% $.v2 %>'; sleep 2"

examples.mistral-handle-error

Mistral Workflow通过可以设置子任务成功失败后的执行顺序,

/opt/stackstorm/packs/examples/actions/workflows/mistral-handle-error.yaml:

version: '2.0'

examples.mistral-handle-error:

description: >

A workflow example that illustrates error handling. By default when any task fails,

the notify_on_error task will be executed and the workflow will transition to the

failed state.

type: direct

input:

- cmd

vars:

error_handled: False

tasks:

task1:

action: core.local cmd="echo 1 && exit 0"

publish:

stdout: <% task(task1).result.stdout %>

on-success:

- task2

on-error:

- handle_error

task2:

action: core.local cmd="echo 2 && exit 1"

publish:

stdout: <% task(task1).result.stdout %>

on-error:

- handle_error

handle_error:

action: core.local

input:

cmd: "printf '<% task(task1).result.stderr %>'"

publish:

error_handled: True

on-complete:

- fail

examples.mistral-handle-error定义了task1和task2,task1成功后执行task2,task2失败后执行handle_error。

$ st2 run examples.mistral-handle-error

..

id: 5afbca362b2556015687cddf

action.ref: examples.mistral-handle-error

parameters: None

status: failed

start_timestamp: Wed, 16 May 2018 06:05:42 UTC

end_timestamp: Wed, 16 May 2018 06:05:45 UTC

+--------------------------+------------------------+--------------+------------+-------------------------------+

| id                       | status                 | task         | action     | start_timestamp               |

+--------------------------+------------------------+--------------+------------+-------------------------------+

| 5afbca372b2556015687cde2 | succeeded (0s elapsed) | task1        | core.local | Wed, 16 May 2018 06:05:43 UTC |

| 5afbca372b2556015687cde4 | failed (1s elapsed)    | task2        | core.local | Wed, 16 May 2018 06:05:43 UTC |

| 5afbca382b2556015687cde6 | succeeded (0s elapsed) | handle_error | core.local | Wed, 16 May 2018 06:05:44 UTC |

Mistral Workflow可以针对失败的子任务进行重跑(StackStorm2.7版本的ActionChain不支持从失败的子任务继续重跑):

$ st2 execution re-run 5afbca362b2556015687cddf --tasks task2

.

id: 5afbcadc2b2556015687cde8

action.ref: examples.mistral-handle-error

parameters: None

status: failed

result_task: task2

result:

failed: true

return_code: 1

stderr: ''

stdout: 2

succeeded: false

start_timestamp: Wed, 16 May 2018 06:08:28 UTC

end_timestamp: Wed, 16 May 2018 06:08:30 UTC

+--------------------------+------------------------+--------------+------------+-------------------------------+

| id                       | status                 | task         | action     | start_timestamp               |

+--------------------------+------------------------+--------------+------------+-------------------------------+

| 5afbcadc2b2556015687cdea | failed (1s elapsed)    | task2        | core.local | Wed, 16 May 2018 06:08:28 UTC |

| 5afbcadd2b2556015687cdec | succeeded (0s elapsed) | handle_error | core.local | Wed, 16 May 2018 06:08:29 UTC |

+--------------------------+------------------------+--------------+------------+-------------------------------+

examples.mistral-repeat

Mistral Workflow支持循环语法:

/opt/stackstorm/packs/examples/actions/workflows/mistral-repeat.yaml

version: '2.0'

examples.mistral-repeat:

description: >

A sample workflow that demonstrates how to repeat a task

x number of times with the same inputs.

type: direct

input:

- cmd

- count

tasks:

repeat:

with-items: i in <% list(range(0, $.count)) %>

action: core.local cmd=<% $.cmd %>

publish:

result: <% task(repeat).result.select($.stdout) %>

循环5次执行命令:

st2 run examples.mistral-repeat cmd=date count=5

..

id: 5afbdab82b2556015687ce19

action.ref: examples.mistral-repeat

parameters:

cmd: date

count: 5

status: succeeded

result_task: repeat

result: - failed: false

return_code: 0

stderr: ''

stdout: Wed May 16 07:16:09 UTC 2018

succeeded: true

- failed: false

return_code: 0

stderr: ''

stdout: Wed May 16 07:16:09 UTC 2018

succeeded: true

- failed: false

return_code: 0

stderr: ''

stdout: Wed May 16 07:16:09 UTC 2018

succeeded: true

- failed: false

return_code: 0

stderr: ''

stdout: Wed May 16 07:16:09 UTC 2018

succeeded: true

- failed: false

return_code: 0

stderr: ''

stdout: Wed May 16 07:16:09 UTC 2018

succeeded: true

start_timestamp: Wed, 16 May 2018 07:16:08 UTC

end_timestamp: Wed, 16 May 2018 07:16:11 UTC

+--------------------------+------------------------+--------+------------+-------------------------------+

| id                       | status                 | task   | action     | start_timestamp               |

+--------------------------+------------------------+--------+------------+-------------------------------+

| 5afbdab82b2556015687ce20 | succeeded (1s elapsed) | repeat | core.local | Wed, 16 May 2018 07:16:08 UTC |

| 5afbdab82b2556015687ce22 | succeeded (1s elapsed) | repeat | core.local | Wed, 16 May 2018 07:16:08 UTC |

| 5afbdab82b2556015687ce23 | succeeded (1s elapsed) | repeat | core.local | Wed, 16 May 2018 07:16:08 UTC |

| 5afbdab82b2556015687ce21 | succeeded (1s elapsed) | repeat | core.local | Wed, 16 May 2018 07:16:08 UTC |

| 5afbdab82b2556015687ce24 | succeeded (1s elapsed) | repeat | core.local | Wed, 16 May 2018 07:16:08 UTC |

+--------------------------+------------------------+--------+------------+-------------------------------+

参考

  • https://yaql.readthedocs.io/en/latest/
  • http://jinja.pocoo.org/
  • http://jinja.pocoo.org/

作者简介

吴龙辉,现任网宿科技云计算架构师,致力于云计算PaaS的研究和实践,《Kubernetes实战》作者,活跃于CloudFoundry,Docker,Kubernetes等开源社区,贡献代码和撰写技术文档。 
邮箱: wlh6666@qq.com

StackStorm分析(四)Mistral说明相关推荐

  1. 手机自动化测试:Appium源码分析之跟踪代码分析四 1

    手机自动化测试:Appium源码分析之跟踪代码分析四 控制器模块 // Appium webserver controller methods // https://github.com/hugs/a ...

  2. ArcGIS网络分析之Silverlight客户端最近设施点分析(四)

    ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 原文:ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 在上一篇中说了如何实现最近路径分析,本篇将讨论如何 ...

  3. ABP源码分析四十七:ABP中的异常处理

    ABP源码分析四十七:ABP中的异常处理 参考文章: (1)ABP源码分析四十七:ABP中的异常处理 (2)https://www.cnblogs.com/1zhk/p/5538983.html (3 ...

  4. 【投屏】Scrcpy源码分析四(最终章 - Server篇)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  5. gSOAP 源码分析(四)

    gSOAP 源码分析(四) 2012-6-2 邵盛松 前言 本文主要说明gSOAP中对Client的认证分析 gSOAP中包含了HTTP基本认证,NTLM认证等,还可以自定义SOAP Heard实现认 ...

  6. 计算机教材与学情分析,四年级计算机教学计划范文(通用3篇)

    四年级计算机教学计划范文(通用3篇) 日子在弹指一挥间就毫无声息的流逝,我们将带着新的期许奔赴下一个挑战,是时候静下心来好好写写教学计划了.如何把教学计划写出新花样呢?下面是小编精心整理的四年级计算机 ...

  7. Spring 源码分析(四) ——MVC(二)概述

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) from:Spring 源码分析(四) --MVC(二)概述 - 水门-kay的个人页面 - OSCHINA ...

  8. 【Java 虚拟机原理】Class 字节码二进制文件分析 四 ( 字段表数据结构 | 字段表详细分析 | 访问标志 | 字段名称 | 字段描述符 | 属性项目 )

    文章目录 前言 一.字段表总数据结构 二.访问标志 三.字段名称 四.字段描述符 五.属性项目数 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 三 ( 访问和修饰标志 | ...

  9. 内核启动流程分析(四)源码浅析

    目录 kernel(四)源码浅析 建立工程 启动简析 head.s 入口点 查询处理器 查询机器ID 启动MMU 其他操作 start_kernel 处理命令行 分区 kernel(四)源码浅析 建立 ...

最新文章

  1. 华硕无线网卡测试软件,家用无线网卡王者 华硕PCE-AC88 双频3100网卡测试
  2. 类库,通用变量,is/as运算符,委托。
  3. Ruby. Vs . Python
  4. python读文件en_python 点云las、laz文件的读取、写入、压缩
  5. 完全内核移植–kernel3.15.3
  6. ArcGIS之通过Model Builder执行地理处理
  7. hc06蓝牙模块介绍_SKYLAB|基于蓝牙工卡的主被动一体化室内定位方案
  8. 【Java】关于学习while do-while for循环知识点的总结
  9. (转载)equals与==
  10. ubuntu 本地源搭建
  11. jar反编译工具 比jd-gui 功能更强大的 Luyten 查看jar源码, 解决jd反编译代码中break labelxxx 、 static初始块中出现return 等问题
  12. oracle触发器实例
  13. linux c语言ide,linux下用过的c++IDE
  14. 重装系统后电脑只剩下C盘怎么办?怎样给电脑磁盘分区增加盘符?
  15. linux下1060显卡驱动安装,ubuntu16.04 联想拯救者y7000笔记本电脑安装1060显卡驱动,及ubuntu16.04更新内核...
  16. csv文件的格式---Comma Separate Values
  17. android动态style,Android控件动态设置style的问题
  18. 数论——Baby Step Giant Step大步小步算法
  19. Unity 相机 2D视角 与3D 视角 自由动态 切换
  20. C语言:选列主元约当消元法求线性方程组唯一解

热门文章

  1. 使用 Python 进行 GUI 掷骰子模拟
  2. SMP865X广告机之蓝牙(bluetooth)
  3. JAVA 获取树的所有路径-深度优先遍历和广度优先
  4. 拆轮子系列之教你一步步写验证码控件
  5. 关于node启动本地服务器的一些问题
  6. 处理器运算能力单位(TOPS、GOPS、MOPS)
  7. android应用程序开发(第二版)课后习题答案.doc,android移动应用开发习题答案.pdf
  8. 赠书福利丨人类历史上那些伟大的贸易
  9. 从mongodb移除分片
  10. DHT11 温湿度传感器 单片机 原理