StackStorm介绍
StackStorm是一个强大的自动化平台,结合DevOps和ChatOps,提供可扩展、灵活和健壮的工具链用于应用、服务和工作流的自动化能力。
Webhook
StackStorm提供了Webhook来触发Trigger。 Sensor是属于pull的机制,即Sensor去探测外部系统,当事件发生时区触发Trigger。而Webhook是的push的机制,由外部系统来调用Webhook来主动触发Trigger。
自定义Webhook
StackStorm提了一个Triggercore.st2.webhook用于注册Webhook:
$ st2 trigger get core.st2.webhook +-------------------+--------------------------------------------------------------+ | Property | Value | +-------------------+--------------------------------------------------------------+ | id | 5afa49092b2556015687cca4 | | ref | core.st2.webhook | | pack | core | | name | st2.webhook | | description | Trigger type for registering webhooks that can consume | | | arbitrary payload. | | parameters_schema | { | | | "additionalProperties": false, | | | "type": "object", | | | "properties": { | | | "url": { | | | "required": true, | | | "type": "string" | | | } | | | } | | | } | | payload_schema | { | | | "type": "object" | | | } | | tags | | | uid | trigger_type:core:st2.webhook | +-------------------+--------------------------------------------------------------+ |
注册Webhook实际上就是创建一个Rule,Rule的Trigger是core.st2.webhook:
/opt/stackstorm/packs/examples/rules/sample_rule_with_webhook.yaml
--- name: "sample_rule_with_webhook" pack: "examples" description: "Sample rule dumping webhook payload to a file." enabled: true
trigger: type: "core.st2.webhook" parameters:
criteria: trigger.body.name: pattern: "st2" type: "equals"
action: ref: "core.local" parameters: cmd: "echo \"{{trigger.body}}\" >> ~/st2.webhook_sample.out ; sync" |
core.st2.webhook需要提供一个参数url,这就是Webhook的调用URL,比如url: "sample"那么Webhook的调用URL就是http://{$ST2_IP}/api/v1/webhooks/sample
创建完Action相应的Webhook也就注册成功,可以通过命令行查询到:
$ st2 webhook list +---------+------------------+-------------+ | url | type | description | +---------+------------------+-------------+ | sample | core.st2.webhook | | +---------+------------------+-------------+ |
Webhook是调用StackStorm的API,API地址可以通过配置文件/etc/st2/st2.conf查看:
# Base URL to the API endpoint excluding the version api_url =http://127.0.0.1:9101 |
另外调用StackStorm API需要提供Authentication,创建一个api-key
$ st2 apikey create -k -m '{"used_by": "my integration"}' YTkyNWYyOGE0YjEyMjQyYjgxYTdlNTRjYWFjZjA1OWM2ZDZkNWJiODEyZDczMjU1YWE5MmE2NjIwNTRjOWRiOA |
备注:Authentication参考
https://github.com/StackStorm/st2docs/blob/master/docs/source/authentication.rst
然后就可以调用Webhook:
$ curl -X POST http://127.0.0.1:9101/v1/webhooks/sample \ -H 'St2-Api-Key: YTkyNWYyOGE0YjEyMjQyYjgxYTdlNTRjYWFjZjA1OWM2ZDZkNWJiODEyZDczMjU1YWE5MmE2NjIwNTRjOWRiOA' \ -H "Content-Type: application/json" \ --data '{"name": "st2"}' |
Webook调用成功后,并且匹配Rule的规则,Webhook的请求消息体name==st2,这样就会执行Action,输出日志到 ~/st2.webhook_sample.out。
通用Webhook
除了创建Rule的注册Webhook之外,可以直接调用StackStrom提供的通用Webhook名称叫st2,URL是http://{$ST2_IP}/api/v1/webhooks/st2。通过调用通用Webhook就可以直接利用已有的Rule,不需要再单独创建Rule
比如已经有个Rule:
... trigger: type: "mypack.mytrigger" criteria: trigger.attribute1: type: "equals" pattern: "value1" action: ref: "mypack.myaction" parameters: ... |
然后调用通用Webhook:
$ curl -X POST http://127.0.0.1:9101/v1/webhooks/st2 \ -H 'St2-Api-Key: YTkyNWYyOGE0YjEyMjQyYjgxYTdlNTRjYWFjZjA1OWM2ZDZkNWJiODEyZDczMjU1YWE5MmE2NjIwNTRjOWRiOA' \ -H "Content-Type: application/json" \ --data '{"trigger": "mypack.mytrigger", "payload": {"attribute1": "value1"}}' |
参考
- lhttps://docs.stackstorm.com/index.html
作者简介
吴龙辉,现任网宿科技云计算架构师,致力于云计算PaaS的研究和实践,《Kubernetes实战》作者,活跃于CloudFoundry,Docker,Kubernetes等开源社区,贡献代码和撰写技术文档。邮箱: [email protected]