变量
全部变量被vars关键词定义在顶部。
Tasks任务通过publish关键字发布新的变量
所有的变量都被Jinja语法引用。累计的已发布变量都可以在一个ActionChian执行结果的publisher属性中被获得,如果display_published属性支持ActionChain Runner。
示例:
---
vars:
domain: "{{ st2kv.system.domain }}" # Global Var
port: 9101
chain:
-
name: get_service_data
ref: my_pack.get_services
publish:
url_1: http://"{{ get_service_data.result[0].host.name }}.{{ domain }}:{{ port }}"
这个publish_data.yaml工作流在examples包中,它通过使用vars和publish显示了一个复杂的例子:
---
vars:
domain: "{{ st2kv.system.domain }}" # `system` references DataStore key-values. Null if not set.
api_port: 9101
webui_port: 8080
chain:
-
name: "get_host"
ref: "core.local"
parameters:
cmd: hostname | tr -d ' \n'
publish:
# Publish a variable to shortcut a long expression
api_url: "http://{{ get_host.stdout }}:{{ api_port }}"
webui_url: "http://{{ get_host.stdout }}:{{ webui_port }}"
host: "{{ get_host.stdout }}"
# Jinja woodoo used for basic logic
fqdn: "{{ get_host.stdout }}{% if domain %}.{{ domain }}{% endif %}"
# A complex object can be published
paths:
api: [ "v1/actions", "v1/triggers"]
webui: "/"
auth_port: "{{ api_port + 1 }}"
# This variable references "system_info_path" variable which is an action parameter
system_info: "{{ system_info_path }}"
on-success: say_the_names
-
name: say_the_names
2 在任务之间传递数据
先前的任务的输出可以通过类似的方式作为一个动作链的输入。
在例子 echochain_param.yaml中展示了输入和数据在工作流中如何传递。
---
chain:
-
name: "c1"
ref: "core.local"
parameters:
cmd: "echo c1, input {{input1}}" # Refers to action's input parameter
on-success: "c2"
on-failure: "c4"
-
name: "c2"
ref: "core.local"
parameters:
cmd: "echo c2 {{c1.stdout}}" # refers to previous action's output
on-success: "c3"
on-failure: "c4"
-
name: "c3"
ref: "core.local"
parameters:
cmd: "echo c3 {{c2.stdout}}"
on-failure: "c4"
-
name: "c4"
ref: "core.local"
parameters:
cmd: "echo fail c4"
default: "c1"
说明:
1 一个任务的输出总是以该任务的名称作为前缀,例如:
在{"cmd":"echo c2 {{c1.stdout}}"}中,c1.stdout执行了'c1'的输出,
并且挖掘到输出的属性列表中。这个引用的关键就是action_execution对象的result
字段。
2) 一个特殊的__results 的键提供了对整个链执行结果的访问。
3 在不同的工作流之间传递数据
在stackstorm中,一个工作流仅仅是一个动作。这意味着可以将一个工作流的数据传递
给另一个,传递到一个动作中,可以使用action参数。
在下面的例子中,有两个工作流-workflow1和workflow2。
在workflow1中task2调用workflow2并传递变量date给它作为一个动作参数。
workflow2接着可以使用这个值并将它打印到便准输出。
workflow1.yaml:
---
chain:
-
name: "task1"
ref: "core.local"
parameters:
cmd: "date"
on-success: "task2"
-
name: "task2"
ref: "mypack.workflow2"
parameters:
date: "{{ task1.stdout }}" # Here we pass result from "task1" as a "date" action parameter to the action "workflow2"
workflow2.meta.yaml:
---
name: "workflow2"
description: "..."
runner_type: "action-chain"
entry_point: "workflow2.yaml"
enabled: true
parameters:
date:
type: "string"
description: "Date which show be printed to stdout"
required: True
workflow2.yaml
---
chain:
-
name: "task1"
ref: "core.local"
parameters:
cmd: "echo {{ date }}" # Here we echo the variable "date" which was passed to the workflow as an action parameter
上述例子可以应用在当有两个相关的工作流,并且一个调用了另一个的场景。
如果拥有两个独立的工作流,并且希望在它们之间传递数据或者在另一个工作流中使用一个工作流的数据,最常见的方法就是使用内置的键值对datastore。
在第一个工作流中,可以在datastore中存储数据,并在第二个工作流中在datastore中查询数据。
这个方法创建了严密的链接。
使用action参数意味着第二种工作流可以被服用并且运行独立于第一个-仅仅需要传递需要的参数给它