StackStorm Docker部署及插件开发
目录
基本介绍
stackstorm是一个事件驱动的自动化引擎,可以将应用程序、服务和工作流程连接起来,它具有可扩展性和灵活性。
主要角色:
-
- 传感器(Sensors):是用于分别接收或监视事件的入站或出站集成的Python插件。 当来自外部系统的事件发生并由传感器处理时,StackStorm触发器将发射到系统中。
- 触发器(Triggers):是外部事件的StackStorm表示形式。 有通用触发器(例如定时器,webhooks)和集成触发器(例如,Sensu告警,JIRA问题更新)。 通过编写传感器插件可以定义新的触发器类型。
- 动作(Actions)是StackStorm出站集成。 有通用动作(ssh,REST调用),集成(OpenStack,Docker,Puppet)或自定义操作。 动作是Python插件或任何脚本,通过添加几行元数据将其消耗到StackStorm中。 动作可以由用户通过CLI或API直接调用,或者作为规则和工作流程的一部分使用和调用。
- 规则(Rules):将触发器映射到动作(或工作流),应用匹配条件并将触发器加载到动作输入中。
- 工作流(Workflows)将动作拼接成“超级动作”,定义顺序,转换条件以及传递数据。 大多数自动化不止一步,因此需要多个动作。 工作流就像“原子”动作一样,可在Action库中使用,并且可以手动调用或由规则触发。
- 包(Packs)是内容部署的单位。 它们通过对集成(触发器和动作)和自动化(规则和工作流)进行分组,简化了StackStorm可插拔内容的管理和共享。 StackStorm Exchange上有越来越多的包可用。 用户可以创建自己的包,在Github上共享它们,或者提交给StackStorm Exchange.
- 审计跟踪(Audit Trail)记录并存储手动或自动操作执行的审计跟踪,并存储触发上下文和执行结果的全部细节。 它还被记录在审计日志中,用于集成外部日志记录和分析工具:LogStash,Splunk,statsd,syslog
Docker部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 获取配置和代码 git clone https://github.com/stackstorm/st2-docker cd st2-docker # 启动 docker-compose up -d # 停止 docker-compose down # 进入容器使用cli命令:st2 docker-compose exec st2client bash # dashboard界面 http://localhost 用户名:st2admin 密码:Ch@ngeMe |
插件开发
1 2 3 4 5 |
# 进入项目 目录 cd st2-docker/packs.dev # 参考文档创建插件 # https://docs.stackstorm.com/reference/packs.html |
安装插件
方法1:
1 2 3 |
cd <name_pack> st2 pack install file://`pwd`/<name_pack> |
方法2:
1 2 |
mv ./<name_pack> /opt/stackstorm/packs st2ctl reload |
插件及配置参考
目录结构
1 2 3 4 5 6 7 8 9 10 |
tree . ├── actions │ ├── task1.sh │ └── task1.yaml ├── pack.yaml ├── requirements.txt └── sensors ├── sensor1.py └── sensor1.yaml |
传感器
sensors/sensor1.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
--- class_name: "HelloSensor" entry_point: "sensor1.py" description: "Test sensor that emits triggers." trigger_types: - name: "event1" description: "An example trigger." payload_schema: type: "object" properties: executed_at: type: "string" data: type: "string" |
sensors/sensor1.py, 发出的事件名为hello.event1,没有指定trace
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import eventlet import datetime import requests from st2reactor.sensor.base import PollingSensor class HelloSensor(PollingSensor): def __init__(self, sensor_service, config): super(HelloSensor, self).__init__(sensor_service=sensor_service, config=config) self._logger = self.sensor_service.get_logger(name=self.__class__.__name__) self._stop = False self._poll = 60 def setup(self): pass def poll(self): res = requests.get('http://81.70.49.199/test') payload = { "data": res.text.strip(), "executed_at": datetime.datetime.now().strftime('%F %X') } res = self.sensor_service.dispatch(trigger='hello.event1', payload=payload) # trace=trace_id 需生成或外部系统传入 def cleanup(self): self._stop = True # Methods required for programmable sensors. def add_trigger(self, trigger): pass def update_trigger(self, trigger): pass def remove_trigger(self, trigger): pass |
动作
actions/task.yaml
1 2 3 4 5 6 7 8 9 10 11 12 |
--- name: task pack: hello runner_type: "local-shell-script" description: hello! enabled: true entry_point: task.sh parameters: data: type: string required: true position: 1 |
actions/task.sh
1 2 |
#!/bin/bash curl "81.70.49.199/test.html?$1" |
很详细,学到了,为博主点赞