1. StackStorm概述
1.1 StackStorm介绍
-
StackStorm是一个开源的事件驱动自动化平台,它允许开发者和系统管理员自动化IT和网络操作。StackStorm结合了IT运维、DevOps和网络安全团队的需求,提供了一个集中式的工作流自动化解决方案,包括事件响应、运行书自动化、配置管理和编排。
-
StackStorm 有助于自动执行常见的操作模式。一些例子是:
-
便于故障排除 - 触发 Nagios、Sensu、New 捕获的系统故障 Relic 和其他监控系统,在物理节点上运行一系列诊断检查, OpenStack 或 Amazon 实例,以及应用程序组件,并将结果发布到共享的 通信上下文,例如 Slack 或 JIRA。
-
自动修复 - 识别和验证 OpenStack 计算上的硬件故障 节点,正确撤离实例并向管理员发送电子邮件以了解可能的停机时间,但如果 任何事情都会出错 - 冻结工作流并调用 PagerDuty 来唤醒人类。
-
持续部署 - 使用 Jenkins 构建和测试,预置新的 AWS 集群,开启 负载均衡器的一些流量,以及基于 NewRelic 应用的前滚或后滚 性能数据。
-
-
StackStorm 可帮助您将这些模式和其他操作模式组合为规则、工作流或操作。 这些规则和工作流 - StackStorm 平台中的内容 - 被存储为代码,这些代码 意味着它们支持您现在用于代码开发的相同协作方法。
1.2 StackStorm的主要特点
-
事件驱动:能够响应来自各种源的事件,包括监控系统、日志、时间触发等。
-
集成性:可以与多种工具和系统集成,例如Ansible、Puppet、Docker、Kubernetes等。
-
工作流:使用YAML或Python编写工作流,实现任务的自动化和编排。
-
API驱动:提供REST API,允许通过编程方式触发和控制自动化流程。
-
社区支持:作为一个开源项目,StackStorm拥有活跃的社区,提供持续的更新和支持。
1.3 StackStorm工作原理
-
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):
-
StackStorm 记录和存储手动或自动操作执行的审计跟踪。
-
审计日志包含触发上下文和执行结果的详细信息,并可以与外部日志记录和分析工具集成(如LogStash、Splunk、statsd、syslog)。
-
-
架构(Architecture):
-
StackStorm 采用模块化架构,由松散耦合的服务组件组成。
-
这些组件通过消息总线进行通信,并可以水平扩展以支持大规模自动化。
-
StackStorm 提供 Web UI、CLI 客户端、REST API 和 Python 客户端绑定,以方便开发和操作。
-
-
2. StackStorm安装部署
2.1 基于RHEL 7/CentOS 7
2.1.1 系统要求
-
StackStorm 需要 Ubuntu、RHEL、RockyLinux 或 CentOS Linux。任何其他 Linux 发行版都不支持它。 下表列出了受支持的 Linux 版本,以及 Vagrant Boxes 和 Amazon AWS 我们用于测试的实例。
-
测试和部署 StackStorm 的建议最小大小:
测试 | 生产 |
---|---|
双 CPU | 四核 CPU |
2GB内存 | >16GB 内存 |
10GB存储空间 | 40GB存储空间 |
-
默认情况下,StackStorm 和相关服务使用以下 TCP 端口:
服务 | 端口 | 备注 |
---|---|---|
nginx | 80, 443 | Web服务器 |
mongodb | 27017 | 数据库 |
rabbitmq | 4369, 5672, 25672 | 消息队列 |
redis | 6379 | 缓存数据库 |
zookeeper | 2181, 2888, 3888 | 分布式协调服务 |
st2auth | 9100 | StackStorm认证服务 |
st2api | 9101 | StackStorm API服务 |
st2stream | 9102 | StackStorm流服务 |
如果任何其他服务当前正在使用这些端口,StackStorm 可能无法正确安装或运行。
2.1.2 调整SELinux
[root@StackStorm ~]# getenforce Disabled
2.1.3 安装环境依赖包
2.1.3.1 安装 MongoDB、RabbitMQ 和 Redis
-
[root@StackStorm ~]# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm # Add key and repo for the latest stable MongoDB (4.0) [root@StackStorm ~]# rpm --import https://www.mongodb.org/static/pgp/server-4.0.asc [root@StackStorm ~]# bash -c "cat <<EOT > /etc/yum.repos.d/mongodb-org-4.repo [mongodb-org-4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc EOT" # 安装crudini命令行工具 [root@StackStorm ~]# yum install crudini -y # 安装MongoDB [root@StackStorm ~]# yum install mongodb-org -y [root@StackStorm ~]# curl -sL https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash [root@StackStorm ~]# curl -sL https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash [root@StackStorm ~]# yum -y install erlang [root@StackStorm ~]# yum -y install rabbitmq-server [root@StackStorm ~]# yum -y install redis [root@StackStorm ~]# systemctl enable mongod rabbitmq-server redis --now
2.1.3.2 验证 python3-devel
-
CentOS/RHEL 7.x 上默认的 python 是 python 2,StackStorm 使用 python3,需要 python3-devel 包。如果 st2 包在已启用的仓库中可用,则安装 st2 包将自动安装 python3-devel。在 CentOS 发行版上,相关的仓库通常是启用的
[root@StackStorm ~]# yum info python3-devel Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com Available Packages Name : python3-devel Arch : i686 Version : 3.6.8 Release : 21.el7_9 Size : 217 k Repo : updates/7/x86_64 Summary : Libraries and header files needed for Python development URL : https://www.python.org/ License : Python
2.1.4 设置存储库
-
检测您的平台和体系结构,并设置适当的 StackStorm 存储 库。它还将添加用于包签名的 GPG 密钥。
[root@StackStorm ~]# curl -s https://packagecloud.io/install/repositories/StackStorm/stable/script.rpm.sh | sudo bash
2.1.5 安装 StackStorm 组件
[root@StackStorm ~]# yum install -y st2
-
RabbitMQ 连接位于
/etc/st2/st2.conf
-
MongoDB 位于
/etc/st2/st2.conf
-
Redis 在协调部分的连接
/etc/st2/st2.conf
2.1.6 设置数据存储加密
-
键值存储允许用户存储加密值(机密)。这些是 使用对称加密 (AES256) 存储。
[root@StackStorm ~]# DATASTORE_ENCRYPTION_KEYS_DIRECTORY="/etc/st2/keys" [root@StackStorm ~]# DATASTORE_ENCRYPTION_KEY_PATH="${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}/datastore_key.json" [root@StackStorm ~]# mkdir -p ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY} [root@StackStorm ~]# st2-generate-symmetric-crypto-key --key-path ${DATASTORE_ENCRYPTION_KEY_PATH} [root@StackStorm ~]# chgrp st2 ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY} [root@StackStorm ~]# chmod o-r ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY} [root@StackStorm ~]# chgrp st2 ${DATASTORE_ENCRYPTION_KEY_PATH} [root@StackStorm ~]# chmod o-r ${DATASTORE_ENCRYPTION_KEY_PATH} [root@StackStorm ~]# crudini --set /etc/st2/st2.conf keyvalue encryption_key_path ${DATASTORE_ENCRYPTION_KEY_PATH} [root@StackStorm ~]# st2ctl restart-component st2api
2.1.7 配置 SSH 和 SUDO3
-
为了运行本地和远程 shell 操作,StackStorm 使用特殊的系统用户(默认情况下)。 对于远程 Linux 操作,使用 SSH。我们建议在所有设备上配置基于公钥的 SSH 访问 远程主机。我们还建议配置对 localhost 的 SSH 访问以运行示例和 测试。
stanley
-
创建 StackStorm 系统用户,启用无密码 sudo,并设置对“localhost”的 ssh 访问,以便 基于 SSH 的操作可以在本地进行测试。您需要提升的权限才能执行此操作:
# Create an SSH system user (default `stanley` user may already exist) [root@StackStorm ~]# sudo useradd stanley [root@StackStorm ~]# sudo mkdir -p /home/stanley/.ssh [root@StackStorm ~]# sudo chmod 0700 /home/stanley/.ssh # Generate ssh keys [root@StackStorm ~]# sudo ssh-keygen -f /home/stanley/.ssh/stanley_rsa -P "" # Authorize key-based access [root@StackStorm ~]# sudo sh -c 'cat /home/stanley/.ssh/stanley_rsa.pub >> /home/stanley/.ssh/authorized_keys' [root@StackStorm ~]# sudo chown -R stanley:stanley /home/stanley/.ssh # Enable passwordless sudo [root@StackStorm ~]# sudo sh -c 'echo "stanley ALL=(ALL) NOPASSWD: SETENV: ALL" >> /etc/sudoers.d/st2' [root@StackStorm ~]# sudo chmod 0440 /etc/sudoers.d/st2 # Make sure `Defaults requiretty` is disabled in `/etc/sudoers` [root@StackStorm ~]# sudo sed -i -r "s/^Defaults\s+\+?requiretty/# Defaults +requiretty/g" /etc/sudoers
-
2.1.8 启动服务
[root@StackStorm ~]# st2ctl start # 注册传感器、规则和操作 [root@StackStorm ~]# st2ctl reload
2.1.9 验证
-
查看版本
[root@StackStorm ~]# st2 --version st2 3.8.1, on Python 3.6.8
-
输出 RFC 2822 格式的日期和时间。
[root@StackStorm ~]# st2 run core.local -- date -R . id: 66a64cdd02a8613577722802 action.ref: core.local context.user: stanley parameters: cmd: date -R status: succeeded start_timestamp: Sun, 28 Jul 2024 13:51:25 UTC end_timestamp: Sun, 28 Jul 2024 13:51:27 UTC result: failed: false return_code: 0 stderr: '' stdout: Sun, 28 Jul 2024 09:51:27 -0400 succeeded: true
-
列出了操作的执行状态、执行时间和其他相关信息
[root@StackStorm ~]# st2 run core.remote hosts='localhost' -- uname -a . id: 66a64d0702a8613577722805 action.ref: core.remote context.user: stanley parameters: cmd: uname -a hosts: localhost status: succeeded start_timestamp: Sun, 28 Jul 2024 13:52:07 UTC end_timestamp: Sun, 28 Jul 2024 13:52:09 UTC result: localhost: failed: false return_code: 0 stderr: '' stdout: 'Linux StackStorm 3.10.0-1160.71.1.el7.x86_64 #1 SMP Tue Jun 28 15:37:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux' succeeded: true
-
安装软件包
[root@StackStorm ~]# st2 pack install st2 For the "st2" pack, the following content will be registered: actions | 24 rules | 0 sensors | 0 aliases | 12 triggers | 0 Installation may take a while for packs with many items. [ succeeded ] init_task [ succeeded ] download_pack [ succeeded ] make_a_prerun [ succeeded ] get_pack_dependencies [ succeeded ] check_dependency_and_conflict_list [ succeeded ] install_pack_requirements [ succeeded ] get_pack_warnings [ succeeded ] register_pack +-------------+----------------------------------------+ | Property | Value | +-------------+----------------------------------------+ | ref | st2 | | name | st2 | | description | StackStorm utility actions and aliases | | version | 2.0.1 | | author | StackStorm, Inc. | +-------------+----------------------------------------+
-
st2命令帮助
[root@StackStorm ~]# st2 -h
参数/选项 | 说明 |
---|---|
-h, --help |
显示帮助信息并退出 |
--version |
显示程序的版本号并退出 |
--url BASE_URL |
API服务器的基础URL。假设所有服务器使用相同的基础URL,默认端口。默认从环境变量获取ST2_BASE_URL 。 |
--auth-url AUTH_URL |
认证服务的URL。默认从环境变量获取ST2_AUTH_URL 。 |
--api-url API_URL |
API服务器的URL。默认从环境变量获取ST2_API_URL 。 |
--stream-url STREAM_URL |
流端点的URL。默认从环境变量获取ST2_STREAM_URL 。 |
--api-version API_VERSION |
要使用的API版本。默认从环境变量获取ST2_API_VERSION 。 |
--cacert CACERT |
SSL端点的CA证书捆绑路径。默认从环境变量获取ST2_CACERT 。如果不提供,则不验证SSL证书。 |
--basic-auth BASIC_AUTH |
用于认证的可选附加基本认证凭据。 |
--config-file CONFIG_FILE |
CLI配置文件的路径。 |
--print-config |
解析配置文件并打印值。 |
--skip-config |
不解析和使用CLI配置文件。 |
--debug |
启用调试模式。 |
命令 | 说明 |
---|---|
run |
手动调用一个操作。 |
action |
作为对外部事件响应而发生的活动。 |
action-alias |
操作别名。 |
auth |
认证用户并获取访问令牌。 |
login |
认证用户,获取访问令牌,并更新CLI配置目录。 |
whoami |
显示当前认证的用户。 |
apikey |
API密钥。 |
execution |
一个操作的调用。 |
inquiry |
Inquiry提供在工作流中提问并等待响应的机会。 |
key |
键值对用于存储常用配置,以便在传感器、操作和规则中重复使用。 |
pack |
一组相关的集成资源:操作、规则和传感器。 |
policy |
强制执行的策略。 |
policy-type |
可以应用于资源的策略类型。 |
rule |
基于某些标准选择性地在“触发器”上调用“操作”的规范。 |
webhook |
Webhooks。 |
timer |
定时器。 |
runner |
运行器是特定类别操作的处理程序。 |
sensor |
允许将StackStorm与外部系统集成的适配器。 |
trace |
相关的执行、规则和触发实例的一组。 |
trigger |
映射到st2输入的外部事件。它是st2的调用点。 |
trigger-instance |
st2接收到的实际触发器实例。 |
rule-enforcement |
表示规则强制执行的模型。 |
workflow |
工作流编写相关操作的命令。仅支持orquesta工作流。 |
service-registry |
服务注册组和成员相关的命令。 |
role |
RBAC角色。 |
role-assignment |
RBAC角色分配。 |
2.1.10 配置身份验证
-
于文件的提供程序设置身份验证
# 使用密码创建用户 [root@StackStorm ~]# yum -y install httpd-tools # 创建密码文件 [root@StackStorm ~]# echo 'Ch@ngeMe' | sudo htpasswd -i /etc/st2/htpasswd st2admin
-
在以下位置启用和配置身份验证:
/etc/st2/st2.conf