什么是包
包 “pack” 是扩展 StackStorm 的集成和自动化的部署单元。通常, pack 是沿着服务或产品边界组织的,例如 AWS、Docker、Sensu 等。 pack 包含Actions、Workflows、Rules、 Sensors和Aliases。StackStorm 内容始终是 pack 的一部分,因此了解如何创建 pack 并使用它们非常重要。
一些 pack 扩展了 StackStorm 以将其与外部系统集成,例如 AWS,GitHub,JIRA。我们称它们为“集成 pack ”。有些 pack 捕获自动化模式:这类 pack 含特定自动化过程的 workflow, Rule 和 Action - 例如st2 演示 pack 。我们称它们为“自动化 pack ”。这种命名主要是一种约定:StackStorm 本身对两者没有区别。
任何使用该 pack 所针对的服务的人都可以共享和重用集成 pack 。您可以在StackStorm Exchange找到许多这样的示例。自动化 pack 通常是特定于站点的,并且在特定团队或公司之外几乎没有用处;它们通常在内部共享。
总结:Packs是StackStorm中组织工作流、动作和传感器的方式。它们是一组相关的动作、工作流和传感器的集合,通常用于实现特定的自动化任务或集成。
包管理
StackStorm pack 通过命令进行管理:将为您提供有用的概述。st2 pack <...>
/ st2 pack -h
有些(例如core 基本 StackStorm action)是随 StackStorm 预装的。所有其他 pack 都需要您安装。幸运的是,这很容易!
list和get是获取有关本地 pack 信息的主要命令:
|
|
使用 StackStorm 和 pack 管理 Action 时,所有 pack 都会安装到系统 pack 目录中,默认为 /opt/stackstorm/packs/.
除了可以安装本地的包,还可以安装社区维护的包,已有一百多个 StackStorm pack 您可以在 exchange.stackstorm.org 浏览包列表,或通过 CLI 搜索 pack 索引,st2 search 需要联网使用,大部分 stackstorm 包 已经不再更新,使用较多的为 jira, 定时任务,脚本类。
|
|
安装包
从 stackstorm 官方仓库安装
stackstorm pack 安装起来很简单
|
|
此命令将会从GitHub 上的 StackStorm Exchange 仓库下载包,将它们放在 下/opt/stackstorm/packs
,并向 StackStorm 注册它们。
本质上,用户可以同样轻松地使用名从 git 安装属于自己的包。
|
|
默认情况下,将安装最新版本的 pack ,但您可以指定特定版本、分支、tag,甚至提交哈希。只需使用下面命令
|
|
也可以从现有的本地目录安装 pack :
|
|
需要注意的一点是,从 git 存储库目录安装 pack 将仅安装最新提交,并忽略对文件的任何后续未提交更改。在已安装的 pack 上运行会将其替换为请求的版本,或者如果未指定版本,则升级到最新版本。您的配置文件不会被覆盖,因此您可以轻松恢复到旧版本,但对于生产部署,我们建议始终指定版本,防止 st2 pack install latest
包依赖
依赖是从 StackStorm 3.2 开始的新功能!
如果您的包使用其他包中的 Action,您可以在文件 dependencies
的 部分中指定它们 pack.yaml
,StackStorm 将在安装您的包时自动安装它们。
与使用子命令类似,您可以仅使用名称来引用 StackStorm Exchange 中的包,也可以指定包的 Git 存储库 URL。您还可以使用相同的语法来安装特定版本、标签或分支:st2 pack install
|
|
如果存在依赖性冲突,子命令可能会出错,而不会安装任何包。如果您想强制安装包而不安装其依赖项,您可以使用以下标志:
|
|
包卸载
卸载包使用 st2 pack remove
:
|
|
配置包
集成一个包(pack)通常需要针对您的环境进行配置。例如,您需要指定 SMTP 服务器以使用电子邮件 pack 、指定 puppet master URL 以使用 Puppet pack ,或者指定 OpenStack 的 Keystone 端点和租户凭证。
通常大多数需要配置的 pack 都可以交互配置:
|
|
系统将提示您在交互式工具中输入配置参数,其中包含说明、建议和默认值。在保存之前,您还会被要求在文本编辑器中验证您的最终配置文件;它是可选的,大多数包不需要超过两个或三个字段。生成的文件将被放入 /opt/stackstorm/configs/<pack>.yaml
并加载。
注意:StackStorm 将 pack 配置加载到 MongoDB 中。当您使用 st2 pack config 时,它会自动加载 。但是如果您手动编辑 pack 配置,或使用配置管理工具来管理这些文件,则必须告诉StackStorm 加载更新的配置。
更新包配置
|
|
覆盖包的默认值
安装包时,资源的状态是从包中的元数据文件中获取的。有时,在安装社区包时,您可能不希望启用所有资源,例如您只想使用 Action 的子集,或者想要禁用传感器。
在 StackStorm 3.7.0 之前,可以通过以下方式更改此状态:
- 使用 StackStorm API 禁用资源。然而,在重新安装或包重新安装时,这将被忘记。
st2ctl reload
- 手动更改元数据文件。这将在升级时丢失,并且无法轻易跟踪。
在StackStorm 3.7.0中,我们引入了覆盖功能,以便包资源的元数据可以被配置文件覆盖。这将始终在重新加载或包安装时被读取。 ST2 API 仍然允许您覆盖此设置,但与以前一样,StackStorm API 为启用/禁用资源所做的任何更改在重新加载或重新安装时都会被忘记。
覆盖工具当前仅限于允许仅针对以下类型的资源覆盖启用的属性:Action、Alias、Rule 和 Sensor。它由目录 /opt/stackstorm/overrides
控制 。
安装包或重载时,资源状态按如下方式管理:
- 状态是从位于 中的包的资源元数据文件中读取的
/opt/stackstorm/packs/<packname>
。这些是从包的相关存储库下载的,例如 GIT, StackStorm-Exchange。 - 如果 /opt/stackstorm/overrides/_global.yaml 存在,这回应用这个包的默认值或特定于资源的覆盖。允许
_global.yaml
您指定特定资源类型的默认状态,例如禁用所有 Sensor。 _global.yaml
的格式如下(设置为禁用所有内容):
|
|
如果发生了覆盖,则受影响的资源数量将在 Output 中输出,例如:st2ctl reload
|
|
示例:禁用一个包中的所有Sersor
如果要禁用一个包中的所有传感器,我们将创建一个 /opt/stackstorm/overrides/<packname>.yaml
文件,包含以下内容的 sensor:
|
|
示例:禁用所有包中的所有传感器(排除某个包)
相反,如果我们想覆盖除单个包之外的所有传感器,那么我们将创建一个/opt/stackstorm/overrides/_global.yaml
来禁用所有传感器:
|
|
之后创建 /opt/stackstorm/overrides/<packname>.yaml
,为所需的包启用 Sensor
|
|
示例:禁用包的Action,但排除某些Action
|
|
示例:禁用包中某一个Rule
|
|
虚拟环境
在 StackStorm 中,所有包的所有任务都是基于Python虚拟环境运行,以便区隔及管理各个包的Python套件。系统自带包使用系统自带的虚拟环境,位于目录:/opt/stackstorm/st2/
通常,自建的包则需在/opt/stackstorm/virtualenvs目录下创建跟包同样名称的Python虚拟环境。
|
|
在包运行时,需要提前为包含 Python Action/Sensor 的每个包创建一个 Python 虚拟环境 /opt/stackstorm/virtualenv
,Python 依赖将通过 pip -rrequirements.txt
安装在 virtualenv 中,这部分是 Stackstorm 自动处理。
StackStorm v3.4.0 中删除了对 Python 2 的支持。请考虑更新任何仅适用于 Python 2 的包以与 Python 3 配合使用。
如果在 offline 环境中,需要创建一个自定义包,那么需要手动创建对应的虚拟环境,例如,在/opt/stackstorm/virtualenvs目录运行下列命令创建包的虚拟环境。也可以使用 ln 命令创建文件连接。x
|
|