本文发布于Cylon的收藏册,转载请著名原文链接~

什么是包

包 “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 信息的主要命令:

1
2
3
4
5
# List all installed packs
st2 pack list

# Get detailed information about an installed pack
st2 pack get core

使用 StackStorm 和 pack 管理 Action 时,所有 pack 都会安装到系统 pack 目录中,默认为 /opt/stackstorm/packs/.

除了可以安装本地的包,还可以安装社区维护的包,已有一百多个 StackStorm pack 您可以在 exchange.stackstorm.org 浏览包列表,或通过 CLI 搜索 pack 索引,st2 search 需要联网使用,大部分 stackstorm 包 已经不再更新,使用较多的为 jira, 定时任务,脚本类。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
st2 pack searchst2 pack show
# Search query is applied across all pack parameters.

# It will search through pack names:
st2 pack search sensu
# And keywords:
st2 pack search monitoring
# And description (use quotes for multi-word search):
st2 pack search "Amazon Web Services"
# And even pack author:
st2 pack search "Jon Middleton"

# Show an index entry for the pack
# with the exact name match
st2 pack show sensu

安装包

从 stackstorm 官方仓库安装

stackstorm pack 安装起来很简单

1
2
3
4
5
# Install from the Exchange by pack name
st2 pack install sensu

# You can also install multiple packs:
st2 pack install datadog github

此命令将会从GitHub 上的 StackStorm Exchange 仓库下载包,将它们放在 下/opt/stackstorm/packs,并向 StackStorm 注册它们。

本质上,用户可以同样轻松地使用名从 git 安装属于自己的包。

1
2
3
4
5
6
7
8
# Install your own pack from git using http(s)
st2 pack install https://github.com/emedvedev/chatops_tutorial

# Install your own pack from git using ssh
st2 pack install git@github.com/emedvedev/chatops_tutorial

# Install your own pack using gitlab URL (added in release 3.4)
st2 pack install gitlab@gitlab.com:example/examplepack

默认情况下,将安装最新版本的 pack ,但您可以指定特定版本、分支、tag,甚至提交哈希。只需使用下面命令

1
2
3
4
5
6
7
8
# Fetch a specific commit
st2 pack install cloudflare=776b9a4

# Or a version tag
st2 pack install cloudflare=0.1.0

# Or a branch
st2 pack install https://github.com/emedvedev/chatops_tutorial=testing

也可以从现有的本地目录安装 pack :

1
2
# Install a pack from '/home/stanley/bitcoin' dir
st2 pack install file:///home/stanley/bitcoin

需要注意的一点是,从 git 存储库目录安装 pack 将仅安装最新提交,并忽略对文件的任何后续未提交更改。在已安装的 pack 上运行会将其替换为请求的版本,或者如果未指定版本,则升级到最新版本。您的配置文件不会被覆盖,因此您可以轻松恢复到旧版本,但对于生产部署,我们建议始终指定版本,防止 st2 pack install latest

包依赖

依赖是从 StackStorm 3.2 开始的新功能!

如果您的包使用其他包中的 Action,您可以在文件 dependencies 的 部分中指定它们 pack.yaml,StackStorm 将在安装您的包时自动安装它们。

与使用子命令类似,您可以仅使用名称来引用 StackStorm Exchange 中的包,也可以指定包的 Git 存储库 URL。您还可以使用相同的语法来安装特定版本、标签或分支:st2 pack install

1
2
3
4
dependencies:
  - excel
  - powerpoint=0.2.2
  - https://github.com/StackStorm/stackstorm-ms.git

如果存在依赖性冲突,子命令可能会出错,而不会安装任何包。如果您想强制安装包而不安装其依赖项,您可以使用以下标志:

1
st2 pack install --skip-dependencies my-custom-pack

包卸载

卸载包使用 st2 pack remove

1
st2 pack remove sensu

配置包

集成一个包(pack)通常需要针对您的环境进行配置。例如,您需要指定 SMTP 服务器以使用电子邮件 pack 、指定 puppet master URL 以使用 Puppet pack ,或者指定 OpenStack 的 Keystone 端点和租户凭证。

通常大多数需要配置的 pack 都可以交互配置:

1
st2 pack config <pack_name>

系统将提示您在交互式工具中输入配置参数,其中包含说明、建议和默认值。在保存之前,您还会被要求在文本编辑器中验证您的最终配置文件;它是可选的,大多数包不需要超过两个或三个字段。生成的文件将被放入 /opt/stackstorm/configs/<pack>.yaml 并加载。

注意:StackStorm 将 pack 配置加载到 MongoDB 中。当您使用 st2 pack config 时,它会自动加载 。但是如果您手动编辑 pack 配置,或使用配置管理工具来管理这些文件,则必须告诉StackStorm 加载更新的配置。

更新包配置

1
sudo st2ctl reload --register-configs

覆盖包的默认值

安装包时,资源的状态是从包中的元数据文件中获取的。有时,在安装社区包时,您可能不希望启用所有资源,例如您只想使用 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 的格式如下(设置为禁用所有内容):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
---
sensors:
  defaults:
    enabled: false
actions:
  defaults:
    enabled: false
aliases:
  defaults:
    enabled: false
rules:
  defaults:
    enabled: false

如果发生了覆盖,则受影响的资源数量将在 Output 中输出,例如:st2ctl reload

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ st2ctl reload --register-all
Registering content...[flags = --config-file /etc/st2/st2.conf --register-all]
2022-02-07 12:56:43,694 INFO [-] Connecting to database "st2" @ "127.0.0.1:27017" as user "None".
2022-02-07 12:56:43,704 INFO [-] Successfully connected to database "st2" @ "127.0.0.1:27017" as user "None".
2022-02-07 12:56:44,254 INFO [-] =========================================================
2022-02-07 12:56:44,254 INFO [-] ############## Registering triggers #####################
2022-02-07 12:56:44,254 INFO [-] =========================================================
2022-02-07 12:56:44,549 INFO [-] Registered 1 triggers.
2022-02-07 12:56:44,549 INFO [-] =========================================================
2022-02-07 12:56:44,549 INFO [-] ############## Registering sensors ######################
2022-02-07 12:56:44,549 INFO [-] =========================================================
2022-02-07 12:56:44,832 INFO [-] Registered 9 sensors.
2022-02-07 12:56:44,832 INFO [-] 7 sensors had their metadata overridden.

示例:禁用一个包中的所有Sersor

如果要禁用一个包中的所有传感器,我们将创建一个 /opt/stackstorm/overrides/<packname>.yaml 文件,包含以下内容的 sensor:

1
2
3
4
---
sensors:
  defaults:
    enabled: false

示例:禁用所有包中的所有传感器(排除某个包)

相反,如果我们想覆盖除单个包之外的所有传感器,那么我们将创建一个/opt/stackstorm/overrides/_global.yaml来禁用所有传感器:

1
2
3
4
---
sensors:
  defaults:
    enabled: false

之后创建 /opt/stackstorm/overrides/<packname>.yaml,为所需的包启用 Sensor

1
2
3
4
---
sensors:
  defaults:
    enabled: true

示例:禁用包的Action,但排除某些Action

1
2
3
4
5
6
7
8
9
---
actions:
  defaults:
    enabled: false
  exceptions:
    action1:
      enabled: true
    action2:
      enabled: true

示例:禁用包中某一个Rule

1
2
3
4
rules:
  exceptions:
    rule1:
      enabled: false

虚拟环境

在 StackStorm 中,所有包的所有任务都是基于Python虚拟环境运行,以便区隔及管理各个包的Python套件。系统自带包使用系统自带的虚拟环境,位于目录:/opt/stackstorm/st2/

通常,自建的包则需在/opt/stackstorm/virtualenvs目录下创建跟包同样名称的Python虚拟环境。

1
2
3
4
5
6
7
8
9
$ tree virtualenvs/ -L 2
virtualenvs/
├── crontab
│   ├── bin
│   ├── include
│   ├── lib
│   ├── lib64 -> lib
│   └── pyvenv.cfg
.....

在包运行时,需要提前为包含 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

1
$ python -m venv package_name

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2023/11/stackstorm-pack/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。