stackstorm 3. 规则

1 规则


StackStorm使用了规则和工作流来捕获可操作的模式来做自动化。
规则对trigger触发器到action(或工作流)做了映射。应用匹配的criteria并且
映射trigger payloads到动作的输入。

2 规则结构


规则定义在YAML中。规则定义结构,一些碧血的和可选的元素如下所示:
---
    name: "rule_name"                      # required
    pack: "examples"                       # optional
    description: "Rule description."       # optional
    enabled: true                          # required

    trigger:                               # required
        type: "trigger_type_ref"

    criteria:                              # optional
        trigger.payload_parameter_name1:
            type: "regex"
            pattern : "^value$"
        trigger.payload_parameter_name2:
            type: "iequals"
            pattern : "watchevent"

    action:                                # required
        ref: "action_ref"
        parameters:                        # optional
            foo: "bar"
            baz: "{{ trigger.payload_parameter_1 }}"

rule的主要格式如下:
name: 规则名称
pack: 规则的属于方,如果没有指定pack则为default
description: 规则的描述
enabled: 规则是否开启(true或者false)
trigger:emitted from sensors to monitor, and optionally parameters associated with that trigger.
criteria:可选择的集合,包含
    一个trigger的payload的属性
    criteria比较的类型
    pattern: to match against.
action:当一个规则被满足时,执行的动作,包含:
    ref:动作或工作流的名称
    parameters: 执行动作的参数(可选)


3 触发器Trigger


rule中的trigger指定了哪一个即将到来的事件会被检测并被用于规则的匹配。
查看系统中配置的所有触发器可以通过命令:
st2 trigger list

输出结果:
+----------------------------------+----------+----------------------------------+
| ref                              | pack     | description                      |
+----------------------------------+----------+----------------------------------+
| core.st2.CronTimer               | core     | Triggers whenever current time   |
|                                  |          | matches the specified time       |
|                                  |          | constaints like a UNIX cron      |
|                                  |          | scheduler.                       |
| core.st2.DateTimer               | core     | Triggers exactly once when the   |
|                                  |          | current time matches the         |
|                                  |          | specified time. e.g.             |
|                                  |          | timezone:UTC date:2014-12-31     |
|                                  |          | 23:59:59.                        |
| core.st2.IntervalTimer           | core     | Triggers on specified intervals. |
|                                  |          | e.g. every 30s, 1week etc.       |
| core.st2.action.file_writen      | core     | Trigger encapsulating action     |
|                                  |          | file being written on disk.      |
| core.st2.generic.actiontrigger   | core     | Trigger encapsulating the        |
|                                  |          | completion of an action          |
|                                  |          | execution.                       |
| core.st2.generic.inquiry         | core     | Trigger indicating a new         |
|                                  |          | "inquiry" has entered "pending"  |
|                                  |          | status                           |
| core.st2.generic.notifytrigger   | core     | Notification trigger.            |
| core.st2.key_value_pair.create   | core     | Trigger encapsulating datastore  |
|                                  |          | item creation.                   |
| core.st2.key_value_pair.delete   | core     | Trigger encapsulating datastore  |
|                                  |          | item deletion.                   |
| core.st2.key_value_pair.update   | core     | Trigger encapsulating datastore  |
|                                  |          | set action.                      |
| core.st2.key_value_pair.value_ch | core     | Trigger encapsulating a change   |
| ange                             |          | of datastore item value.         |
| core.st2.sensor.process_exit     | core     | Trigger indicating sensor        |
|                                  |          | process is stopped.              |
| core.st2.sensor.process_spawn    | core     | Trigger indicating sensor        |
|                                  |          | process is started up.           |
| core.st2.webhook                 | core     | Trigger type for registering     |
|                                  |          | webhooks that can consume        |
|                                  |          | arbitrary payload.               |
| default.event1                   | default  | An example trigger.              |
| examples.echoflasksensor         | examples | Echo flask sensor.               |
| examples.event                   | examples | An example trigger.              |
| examples.fibonacci               | examples | A fibonacci trigger.             |
| examples.polling_event           | examples | An example trigger.              |
| examples.sample_trigger          | examples | Sample trigger                   |
| linux.file_watch.line            | linux    | Trigger which indicates a new    |
|                                  |          | line has been detected           |
+----------------------------------+----------+----------------------------------+

4 准则Criteria


Rule中的criteria是需要匹配的,逻辑操作符为AND。
Rule中的Criteria被表示成如下形式:
# more variables
criteria:
    trigger.payload_parameter_name1:
        type: "regex"
        pattern : "^value$"
    trigger.payload_parameter_name2:
        type: "iequals"
        pattern : "watchevent"

注意:你可以通过创建多个独立的规则(每个criteria表达式)实现逻辑操作符OR的行为

type: 制定了准则中比较操作符。类型有:
equals,nequals,lessthan,greaterthan,matchwildcard,regex等
pattern: 指定了模式

支持的比较操作符:
Operator    Description
equals    Values are equal (for values of arbitrary type).
nequals    Values are not equal (for values of arbitrary type).
lessthan    Trigger value is less than the provided value.
greaterthan    Trigger value is greater than the provided value.
matchwildcard    Trigger value matches the provided wildcard-like string. This operator provides support for Unix shell-style wildcards which means you can use characters such as * and ?. This operator is preferred over regex for simple string matches.
regex    Trigger value matches the provided regular expression pattern. This operator behaves like re.search('pattern', trigger_value).
iregex    Trigger value matches the provided regular expression pattern case insensitively. This operator behaves like re.search('pattern', trigger_value, re.IGNORECASE).
matchregex    Trigger value matches the provided regular expression pattern. This operator is deprecated in favor of regex and iregex
iequals    String trigger value equals the provided value case insensitively.
contains    Trigger value contains the provided value. Keep in mind that the trigger value can be either a string or an array (list).
ncontains    Trigger value does not contain the provided value. Keep in mind that the trigger value can be either a string or an array (list).
icontains    String trigger value contains the provided value case insensitively.
incontains    String trigger value does not contain the provided string value case insensitively.
startswith    Beginning of the string trigger value matches the provided string value.
istartswith    Beginning of the string trigger value matches the provided string value case insensitively.
endswith    End of the string trigger value matches the provided string value.
iendswith    End of the string trigger value matches the provided string value case insensitively.
timediff_lt    Time difference between trigger value and current time is less than the provided value.
timediff_gt    Time difference between trigger value and current time is greater than the provided value.
exists    Key exists in payload.
nexists    Key doesn’t exist in payload.
inside    Trigger payload is inside provided value. (e.g. testing if “trigger.payload in provided_value”). Reverse of contains. (where contains would test for “trigger.payload contains provided_value”).
ninside    Trigger payload is not inside provided value. (e.g. testing if “trigger.payload not in provided_value”). Reverse of ncontains (where contains would test for “trigger.payload does not contain provided_value”).
search    Search an array (list) in the trigger payload that matches child criteria. See the Advanced Comparison section for more information and examples.


高级的比较:
search操作符可以用于更复杂的操作。它有一个额外的condition参数,
可以嵌套的criteria应用。
例子如下:
---
criteria:
  trigger.issue_fields:
    type: "search"
      # Controls whether all items in the trigger payload must match the child criteria,
      # or if any single item matching the child criteria is sufficient
      condition: any  # <- *At least one* item must match all child patterns
      pattern:
        # Here our context is each item of the list
        # All of these patterns must match the item for the item to be considered a match
        # These are simply other operators applied to each item of the list
        item.field_name:
          type: "equals"
          pattern: "Status"

        item.to_value:
          type: "equals"
          pattern: "Approved"

省略search操作符的用法


5 Action动作


当成功匹配到一个触发器和一个准则时执行的动作或者工作流。
最低限度,一个规则应该指定要执行的动作。一个规则也可以指定动作执行需要的参数。

action:                                # required
    ref: "action_ref"
    parameters:                        # optional
        foo: "bar"
        baz: 1

变量篡改
有时候,当一个规则匹配的时候,需要解析一个触发器的上下文中动作。规则引擎
可以借助Jinja模板语法来串该变量

action:
    ref: "action_ref"
    parameters:
        foo: "bar"
        baz: "{{ trigger.payload_parameter_1 }}"

使用use_none来过去确保null/None值被序列化了
action:
    ref: "action_ref"
    parameters:
        foo: "bar"
        baz: "{{ trigger.payload_parameter_1 | use_none }}"


6 管理规则


通过命令
st2 rule create ${PATH_TO_RULE}
来部署规则
例如:
st2 rule create /usr/share/doc/st2/examples/rules/sample_rule_with_webhook.yaml

加载所有规则,使用:
st2ctl reload --register-rules

如果一个同名的规则已经存在,上述命令会返回错误
为了更新规则,编辑规则定义文件并运行命令:
st2 rule update
例子:
st2 rule update examples.sample_rule_with_webhook /usr/share/doc/st2/examples/rules/sample_rule_with_webhook.yaml

注意:
最佳实践是编辑原始的规则文件,获取规则通过:
st2 rule get <rule name> -j

st2 rule list
st2 rule get examples.sample_rule_with_webhook

卸载一个规则:
st2 rule delete ${RULE_NAME_OR_ID}
例如:
st2 rule delete examples.sample_rule_with_webhook

7 规则的位置


自定义规则被放在:
/opt/stackstorm/packs/<pack_name>/rules
目录。
例如:
/opt/stackstorm/packs/examples/rules

8 测试规则


为了使得测试规则更简单,我们提供了一个
st2-rule-testr
tool which can evaluate rules against trigger instances without running any of the StackStorm components
这个工具通过将一个路径存储到文件中,该文件包含了规则定义和触发示例的定义


st2-rule-tester --rule=${RULE_FILE} --trigger-instance=${TRIGGER_INSTANCE_DEFINITION} --config-file=/etc/st2/st2.conf
echo $?

文件需要同时包含YAML或JSON格式的定义。为了规则,你可以使用你准备部署的相同文件。
定义的文件需要包含如下的keys:
trigger: 完全参考自trigger,例如: core.st2.IntervalTimer
payload: Trigger的payload。这个payload本身。为了弄明白trigger的结构,
      你可以参考sensor元数据文件中trigger_types部分或pack的README。
如果trigger instance匹配,=== RULE MATCHES ===将会被打印,工具将会返回
状态码0.
如果trigger instance不匹配,=== RULE MATCHES ===将不会被打印,工具将会返回
状态码1.

样例如下:
my_rule.yaml:

---
  name: "relayed_matched_irc_message"
  pack: "irc"
  description: "Relay IRC message to Slack if the message contains word StackStorm"
  enabled: true

  trigger:
    type: "irc.pubmsg"
    parameters: {}

  criteria:
      trigger.message:
          type: "icontains"
          pattern: "StackStorm"

  action:
    ref: "slack.post_message"
    parameters:
        message: "{{ trigger.source.nick }} on {{ trigger.channel }}: {{ trigger.message }}"
        channel: "#irc-relay"
trigger_instance_1.yaml:

---
    trigger: "irc.pubmsg"
    payload:
      source:
          nick: "Kami_"
          host: "gateway/web/irccloud.com/x-uvv"
      channel: "#stackstorm"
      timestamp: 1419166748,
      message: "stackstorm is cool!"
trigger_instance_2.yaml:

---
    trigger: "irc.pubmsg"
    payload:
      source:
          nick: "Kami_"
          host: "gateway/web/irccloud.com/x-uvv"
      channel: "#stackstorm"
      timestamp: 1419166748,
      message: "blah blah"
st2-rule-tester --rule=./my_rule.yaml --trigger-instance=./trigger_instance_1.yaml
echo $?
Output:

2015-12-11 14:35:03,249 INFO [-] Connecting to database "st2" @ "0.0.0.0:27017" as user "None".
2015-12-11 14:35:03,318 INFO [-] Validating rule irc.relayed_matched_irc_message for pubmsg.
2015-12-11 14:35:03,331 INFO [-] 1 rule(s) found to enforce for pubmsg.
2015-12-11 14:35:03,333 INFO [-] === RULE MATCHES ===
0
st2-rule-tester --rule=./my_rule.yaml --trigger-instance=./trigger_instance_2.yaml
echo $?
Output:

2015-12-11 14:35:57,380 INFO [-] Connecting to database "st2" @ "0.0.0.0:27017" as user "None".
2015-12-11 14:35:57,444 INFO [-] Validating rule irc.relayed_matched_irc_message for pubmsg.
2015-12-11 14:35:57,459 INFO [-] Validation for rule irc.relayed_matched_irc_message failed on -
  key: trigger.message
  pattern: StackStorm
  type: icontains
  payload: blah blah
2015-12-11 14:35:57,461 INFO [-] 0 rule(s) found to enforce for pubmsg.
2015-12-11 14:35:57,462 INFO [-] === RULE DOES NOT MATCH ===
1

st2-rule-tester --rule-ref=my_pack.fire_on_execution --trigger-instance-id=566b4be632ed352a09cd347d --config-file=/etc/st2/st2.conf
echo $?

如果你正在调试,并且希望可以看到发送给StackStorm触发器实例的列表,可以执行如下命令:

st2 trigger-instance list
输出结果:
+--------------------------+---------------------------------+-------------------------------+-----------+
| id                       | trigger                         | occurrence_time               | status    |
+--------------------------+---------------------------------+-------------------------------+-----------+
| 5c3859e89dc6d67c76ad700c | core.e9534e98-2d1c-4087-97a8-ce | Fri, 11 Jan 2019 16:55:04 UTC | processed |
|                          | 856bf87380                      |                               |           |
| 5c3859ed9dc6d67c76ad700f | core.e9534e98-2d1c-4087-97a8-ce | Fri, 11 Jan 2019 16:55:09 UTC | processed |

你可以
st2 trigger-instance list --trigger=core.e9534e98-2d1c-4087-97a8-ce856bf87380
输出结果:
+--------------------------+---------------------------------+-------------------------------+-----------+
| id                       | trigger                         | occurrence_time               | status    |
+--------------------------+---------------------------------+-------------------------------+-----------+
| 5c385ad89dc6d67c76ad709b | core.e9534e98-2d1c-4087-97a8-ce | Fri, 11 Jan 2019 16:59:04 UTC | processed |
|                          | 856bf87380                      |                               |           |
| 5c385add9dc6d67c76ad709e | core.e9534e98-2d1c-4087-97a8-ce | Fri, 11 Jan 2019 16:59:09 UTC | processed |


你可以通过timestamp_gt和timestamp_lt获取指定时间范围触发器实例
st2 trigger-instance list --trigger="core.e9534e98-2d1c-4087-97a8-ce856bf87380" -timestamp_gt=2019-01-11T12:00:00Z -timestamp_lt=2019-01-11T15:00:00Z

查看trigger-instance
st2 trigger-instance get 5c385ad89dc6d67c76ad709b
输出结果:
+-----------------+---------------------------------------------------------+
| Property        | Value                                                   |
+-----------------+---------------------------------------------------------+
| id              | 5c385ad89dc6d67c76ad709b                                |
| trigger         | core.e9534e98-2d1c-4087-97a8-ce856bf87380               |
| occurrence_time | 2019-01-11T16:59:04.000000Z                             |
| payload         | {                                                       |
|                 |     "executed_at": "2019-01-11 08:59:04.348620+00:00",  |
|                 |     "schedule": null                                    |
|                 | }                                                       |
| status          | processed                                               |

调试一个规则的时候,重发一个trigger instance到StackStorm。你可以使用re-emit命令
st2 trigger-instance re-emit 5c385ad89dc6d67c76ad709b
输出结果:
Trigger instance 5c385ad89dc6d67c76ad709b succesfully re-sent.


9 定时器Timers


Timers允许运行一个特别的动作,该动作可以在一个给定的时间间隔重发,或者在一个指定的
日期和时间重复执行。你可以认为它们是定时任务,但是具备额外的灵活性。
例如在给定的日期和时间,值运行一次动作。
目前,我们支持如下的 timer trigger类型:
core.st2.IntervalTimer: 在指定时间间隔内运行一个动作(例如每隔30秒,每隔24小时,每个星期等)
core.st2.DateTimer: 在给丁的日期和时间运行动作
core.st2.CronTimer: 当当前时间满足了已经定义的UNIX cron格式的时间限制时运行动作。

Timers被作为triggers来实现,这意味着你可以在规则内部使用它们。
在下面的部分中,你可以找到如何在规则定义中使用timers。

1) core.st2.IntervalTimer
可选择的参数: unit, delta
unite的值有: seconds, minutes, hours, days, weeks

每隔30秒运行

---
...
trigger:
  type: "core.st2.IntervalTimer"
  parameters:
     unit: "seconds"
     delta: 30

action:
  ...

每隔24小时运行
---
...

trigger:
  type: "core.st2.IntervalTimer"
  parameters:
      unit: "hours"
      delta: 24

action:
  ...

2) core.st2.DateTimer
可选择的参数有: timezone, date
在一个指定日期运行action

---
...

trigger:
  type: "core.st2.DateTimer"
  parameters:
     timezone: "UTC"
     date: "2014-12-31 23:59:59"
action:
  ...

3) core.st2.CronTimer
支持类似cron的表达式。
查看完全支持的表达式:
请参见:
https://apscheduler.readthedocs.io/en/3.0/modules/triggers/cron.html#api

每天运行

---
...
trigger:
  type: "core.st2.CronTimer"
  parameters:
    timezone: "UTC"
    day_of_week: "*"
    hour: 0
    minute: 0
    second: 0
action:
   ...

注意:
*被认为如果没有值提供,表示每隔一定时间都会触发

等同于下面的:
---
...

trigger:
  type: "core.st2.CronTimer"
  parameters:
      timezone: "UTC"
      hour: 0
      minute: 0
      second: 0

action:
  ...


每小时运行:
---
...

trigger:
  type: "core.st2.CronTimer"
  parameters:
      timezone: "UTC"
      hour: "*"
      minute: 0
      second: 0

action:
  ...

以上内容翻译自:
https://docs.stackstorm.com/rules.html
 

### 回答1: StackStorm是一个开源自动化工具,用于创建、管理和执行工作流和自动化任务。Docker Compose是一个工具,用于定义和运行多个Docker容器的应用程序。StackStorm提供了一个Docker Compose配置文件(docker-compose.yaml),用于快速部署StackStorm服务。 这个docker-compose.yaml文件中包含了StackStorm的各个组件的配置信息。首先,它定义了要使用的基础镜像,如StackStorm工作者(worker)和队列服务(rabbitmq)。然后,它指定了各个容器的名称、端口映射和网络配置。 在docker-compose.yaml文件中,还定义了stackstorm服务容器的环境变量,用于指定配置参数,如数据库连接、日志级别等。此外,还可以定义其他容器的环境变量,以满足不同组件的需求。 通过运行docker-compose命令,可以根据这个配置文件来创建和启动StackStorm服务容器。Docker Compose会自动解析和处理配置文件中的依赖关系,并按照定义的顺序启动容器。这可以让我们快速部署和管理StackStorm服务,并且方便地进行扩展和升级。 总之,StackStorm的docker-compose.yaml文件是用来定义和管理StackStorm服务容器的配置文件。它提供了一种简便的方式来部署和管理StackStorm,使得自动化工作流和任务的创建和执行更加方便和高效。 ### 回答2: StackStorm 是一个开源自动化平台,可以用于自动化各类任务和流程。Docker Compose 是一个用于定义和运行多个 Docker 容器的工具。一般来说,使用 Docker Compose 可以轻松地将 StackStorm 部署到 Docker 容器中。 stackstorm docker-compose.yaml 是一个用于在 Docker Compose 中定义 StackStorm 的配置文件。这个文件包含了 StackStorm 中的各个组件以及它们的配置。在编写这个文件时,我们可以指定 StackStorm 需要运行的容器数量、容器之间的依赖关系等。 通常,stackstorm docker-compose.yaml 包含以下几个部分: 1. Services 部分:这里定义了 StackStorm 中的各个组件的容器。比如,可以指定一个容器运行 StackStorm Web UI,另一个容器运行 StackStorm 后台服务,还可以有其他的容器用于运行 StackStorm 的数据库、消息队列等。 2. Networks 部分:这里定义了容器之间的网络连接方式。可以指定容器使用的网络模式,如桥接模式或者主机模式,以及容器之间的连接关系。 3. Volumes 部分:这里定义了容器中的数据卷。可以将 StackStorm 需要的数据持久化保存到宿主机上的指定目录,以便容器重启后能够恢复数据。 通过编写 stackstorm docker-compose.yaml 文件,并使用 Docker Compose 工具进行部署,可以快速搭建 StackStorm 环境,并保证该环境的可复制性和可移植性。同时,使用 Docker Compose 也方便了 StackStorm 的管理和维护工作,简化了容器之间的依赖关系管理。 ### 回答3: StackStorm是一个开源的自动化平台,它允许用户将不同的任务组织成工作流,并通过事件触发来自动化执行。Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。 在StackStorm中使用Docker Compose,可以帮助我们更方便地部署和管理StackStorm的相关容器和服务。通过编写docker-compose.yaml文件,我们可以定义StackStorm容器的配置和依赖关系。 Docker Compose使用一种声明性的语法来定义应用程序的配置。在docker-compose.yaml文件中,我们可以指定StackStorm容器的镜像、环境变量、端口映射等配置。我们还可以定义其他依赖容器,例如数据库容器,用于支持StackStorm的运行。 以下是一个示例的docker-compose.yaml文件的片段: ``` version: '3.8' services: stackstorm: image: stackstorm/stackstorm:3.3.0 ports: - 443:443 - 80:80 environment: - ST2_VERSION=3.3.0 - ST2_AUTH_USERNAME=admin - ST2_AUTH_PASSWORD=MyPassword depends_on: - postgres postgres: image: postgres:12 environment: - POSTGRES_USER=stackstorm - POSTGRES_PASSWORD=stackstorm ``` 在这个示例中,我们定义了两个服务:stackstorm和postgres。stackstorm服务使用了stackstorm/stackstorm:3.3.0镜像,将443端口和80端口映射到宿主机。我们还指定了一些环境变量,用于配置StackStorm的版本和管理员账号密码。在depends_on部分,我们指定了stackstorm服务依赖于postgres服务。 通过运行docker-compose up命令,Docker Compose将会根据docker-compose.yaml文件创建并启动相应的容器。这样,我们就能够方便地使用Docker Compose来部署和管理StackStorm的相关容器和服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值