故障自愈作为运维领域的热门话题之一,各个公司都会投入大量的人力来开发不同的组件,如何正确、有序的调用不同组件以及避免相同功能组件的开发,是一件亟待解决的问题。StackStrom是一个基于事件流并自动执行的系统框架,基于此,可以让外部系统产生的事件,有序的、可编排的集合到一起,作为一个完整的事件流去执行,从而解决一些高频次的运维难题。

 

StackStorm框架的浅析(一)_StackStorm

 

1

StackStorm简介

StackStorm是一个将服务和工具集成在一起的自动化平台,它将现有的基础架构和应用程序环境联系在一起,因此使用者可以更轻松的自动化调用,把注意力集中在需要执行的操作上。

StackStorm框架的浅析(一)_StackStorm_02

stackstorm中包含sensor,rule,action,workflow等组件,环境内的数据都统一的存在MongoDB中,组件之间消息的通信是利用RabbitMQ实现的。将各个组件组合在一起并加之依赖文件以及配置文件就形成了一个包,st2包的结构如下所示:

StackStorm框架的浅析(一)_StackStorm_03

由包的结构可以看出,每个组件各自形成一个独立的目录,每个组件由一个配置文件以及一个执行文件共同构成。各个组件的具体作用如下:

  • Sensors: 监听和接收外部系统的事件,当某个外部事件出现,trigger被触发执行,现在只支持py文件;

  • Trigger: 是外部事件的具体表现,简单理解为就是事件触发器,衔接sensor和rule,由用户自行定义;

  • Rule: 映射着所有trigger到action的规则,记录着criteria匹配的规则,映射trigger实例到action的input;

  • Action: 是st2的具体执行动作和步骤,可以使用py脚本、执行指定命令;

  • Workflow: 多个action的集合,这些action被有序的、按照预先定义好的规则先后执行,现在支持Orquesta和Mistral两种格式;

各个组件之间实际的交互作用如下图所示:

StackStorm框架的浅析(一)_StackStorm_04

 

2

st2中的packs

packs是stackstorm中最小的部署单元,Pack中包含Action,Workflow,Rule和Sensor等等的配置文件,StackStorm通过Pack进行部署和归类。

packs的查询

 

通过命令 st2 pack list 可以查询已经安装在环境中的packs,效果如下:

StackStorm框架的浅析(一)_StackStorm_05

packs的安装

 

在 StackStorm Exchange中存在很多可用的包,它是stackstorm的一个社区,你可以从上面下载你需要的包,当然你也可以自行编写自己的包上传到社区中。stackstorm的packs安装后会将packs的文件下载到/opt/stackstorm/packs/<your_pack>目录下。st2的packs的安装方式有很多种。

  •  
# 安装某个包的具体的commitst2 pack install cloudflare=776b9a4# 安装某个包的某个具体版本st2 pack install cloudflare=0.1.0# 利用url安装某个包st2 pack install https://github.com/emedvedev/chatops_tutorial=testing

下面重点说一下安装自己编写的包,也就是如何安装本地包。

首先自己编写的包必须传到git上才能成功安装 其次利用命令st2 pack install file:/// + 文件目录可以安装本地包,安装效果如下:

StackStorm框架的浅析(一)_StackStorm_06

可以看到packs的安装需要4个步骤,第一是下载packs,事实上虽然我们称之为从本地安装packs,其实st2还是会从packs所在的git上将代码拉下来,因此这就是为什么我刚刚说自己编写的包必须传到git上才能成功安装的原因了;第二步是预览检查包是否有明显的错误;第三步是安装包的依赖环境,st2对于每个包都会设定一个运行环境,packs所需要的依赖可以写在requirements.txt中,并安装包的过程中一并安装;第四步是注册包,实际上是将包中的各个组件的信息,包中的配置信息以及参数写入MongoDB中。

packs的卸载

 

st2中packs的卸载十分容易,通过命令st2 pack remove + <packname>就可以完成,卸载的效果如下:

StackStorm框架的浅析(一)_StackStorm_07

可以看出packs的卸载主要由两个步骤,第一将packs的注册信息删除;第二步删掉packs的文件;实际上packs的安装和卸载是运行了两个相应的workflow,具体的将在后续专题中讨论。

packs的注册

 

是不是安装上packs以后就可以直接运行packs了呢??当然不是啦(想得美!)还需要手动注册一下packs才能执行。具体的操作如下:

  1. 首先将.yaml文件复制到/opt/stackstorm/configs/目录下,注意在安装packs前该文件不能存在于/opt/stackstorm/configs/目录下,否则会导致安装失败。

  2. 设置该文件的权限为775。

  3. 执行命令sudo st2ctl reload --register-configs就可以运行packs了。

packs的编写

 

这里面我们主要讲解一下packs中配置文件的编写方式,对于各个模块的编写规范,将在后续讨论。

packs除了各个模块外还有4个文件需要编写,分别是:requirements.txt,pack.yaml,packname.yaml以及config.schema.yaml

requirements.txt

requirements.txt是依赖文件,在其中记录的是packs需要运行的环境中的依赖包,包括包的版本

pack.yaml

pack.yaml中定义了pack的一些基础信息,包括packname,版本,描述以及作者信息等,具体效果如下:

StackStorm框架的浅析(一)_StackStorm_08

packname.yaml

对于packname.yaml请注意,该文件的名字并不是”packname.yaml“,而是在pack.yaml中定义的包的名字作为”packname“,请大家不要误解。这个文件中主要记录着packs的一些默认参数,参数可以是整数,小数,字典,数组以及字符串,具体的形式如下:

StackStorm框架的浅析(一)_StackStorm_09

config.schema.yaml

config.schema.yaml是默认参数的具体信息,包括参数名称,类型以及描述等,参数类型包括string,integer,number,list,object,具体形式如下:

StackStorm框架的浅析(一)_StackStorm_10

其中required字段表示该参数是否是必要参数,非必要参数将不会存入MongoDB中,secrect字段表示该参数是否可见的,若为true则用户不可见。

 

StackStorm框架的浅析(一)_StackStorm_11