本文发布于Cylon的收藏册,转载请著名原文链接~
基本概念
从版本 2.4 开始,如果包包含.config.yaml
,可以使用包配置,包配置可以使用配置文件来设置包中资源通用的值,例如 API 凭证、连接详细信息、限制和阈值。这些值在运行时可供操作和传感器使用。
包配置和 Action 参数之间的区别在于,配置通常包含包中所有资源通用的值,并且很少更改。动作参数是随每个动作调用动态提供的,并且可能会发生变化 - 例如,它们可能来自映射某些输入事件的规则。
包配置遵循基础架构即代码方法,并存储在特殊目录中的 YAML 格式文件中(默认情况下 /opt/stackstorm/configs)。每个包都为此配置文件定义自己的架构。
配置 Schema
配置文件的结构是一个 YAML 格式的文件,它定义了该包的配置文件。该配置由包作者自行编写,包含有关每个可用配置项的信息,例如名称, Secret等)。该文件已命名 config.schema.yaml 并位于包目录 /opt/stackstorm/packs/<mypack> 的根目录中。
这是一个示例包配置文件:
---
api_key:
description: "API key"
type: "string"
required: true
api_secret:
description: "API secret"
type: "string"
secret: true
required: true
region:
description: "API region to use"
type: "string"
required: true
default: "us-east-1"
private_key_path:
description: "Path to the private key file to use"
type: "string"
required: false
在该示例中,配置文件由 4 项 配置组成 (api_key, api_secret, region, private_key_path)
注,api_secret 被标注为 secret,这意味着如果使用动态值,则该值将加密存储在数据存储中。
除了上面所示的“平面”配置之外,模式还支持嵌套对象。例如:
---
consumer_key:
description: "Your consumer key."
type: "string"
required: true
secret: true
consumer_secret:
description: "Your consumer secret."
type: "string"
required: true
secret: true
access_token:
description: "Your access token."
type: "string"
required: true
secret: true
access_token_secret:
description: "Your access token secret."
type: "string"
required: true
secret: true
sensor:
description: "Sensor specific settings."
type: "object"
required: false
additionalProperties: false
properties:
device_uuids:
type: "array"
description: "A list of device UIDs to poll metrics for."
items:
type: "string"
required: false
在该示例中,配置文件可以包含一个 sensor 项目,该项目是具有单个 device_uuids 属性的对象。
配置文件
配置文件是 YAML 格式的文件,该文件可以包含 “静态” 或 “动态” 值。配置文件已命名并位于 /opt/stackstorm/configs/<pack name>.yaml 目录中。文件所有权应该是 st2:st2
例如,对于名为 libcloud 的包 配置文件位于 /opt/stackstorm/configs/libcloud.yaml。
---
api_key: "some_api_key"
api_secret: "{{st2kv.user.api_secret}}" # user-scoped configuration value which is also a secret as declared in config schema
region: "us-west-1"
private_key_path: "{{st2kv.system.private_key_path}}" # global datastore value
配置文件不会在 run-time时动态读取,必须先进行注册,然后将值加载到 StackStorm DB 中。它们的注册方式与其他资源相同,通过运行 st2ctl reload / st2-register-content 脚本来注册。对于config,您需要使用 –register-configs flag 运行此脚本:
sudo st2ctl reload --register-configs
# Or
sudo st2-register-content --register-configs
在使用上述命令加载和注册 config 时,将根据 shema 验证配置文件中的静态值。如果 schema 不存在,则不执行验证。
注:仅验证配置中的静态值。动态值(使用 Jinja 表示法引用数据存储中的值的值)在运行时解析,因此无法在 register/load 阶段验证它们。
静态配置值
静态配置值是从配置文件加载并按原样使用的值。
动态配置值
动态配置值提供了额外的灵活性,并包括对用户范围的数据存储值的支持。当您想要根据调用操作的用户使用不同的配置值时,这非常有用。
动态配置值是包含 Jinja 模板表达式的值。该模板表达式在运行时进行计算,并解析为 数据存储区 值的名称(Keys)。然后,该数据存储值将用作配置值。
注:目前只有字符串(字符串类型)支持动态配置值。
在config中,动态配置值的引用如下:
---
api_secret: "{{st2kv.user.api_secret}}" # user-scoped configuration value which is also a secret as declared in config schema
private_key_path: "{{st2kv.system.private_key_path}}" # global datastore value
api_secret 是一个用户范围的动态配置值,这意味着 user 部分将被触发操作执行的用户的用户名替换。
动态配置值存储在“数据存储”中,并使用 CLI 或 API 进行配置。
如果某个值在配置 schema 中被标记为加密,则需要将其加密存储在数据存储中。设置该值时, 应使用 –encrypt 标志,如下所示:
st2 key set api_secret "my super secret api secret" --scope=user --encrypt
在上面的示例中,private_key_path 常规动态配置值,这意味着 private_key_path 将从数据存储中加载与此键对应的数据存储项。在这种情况下,使用命令行将该值设置如下:
st2 key set private_key_path "/home/myuser/.ssh/my_private_rsa_key"
配置的加载和配置动态值解析
配置文件在注册时加载。动态值在运行时解析。对于传感器,这是传感器容器为传感器实例生成子进程的时间,对于 Action,这是执行 Action 的时间。
解析和加载用户范围的配置值时,触发操作 Action 的经过身份验证的用户将用作解析值时的上下文。
在解析和加载用户范围配置值时,使用认证后的用户触发操作 Action 的来作为上下文来解析该值。
命令行配置动态值
可以使用 st2 key 命令集与其他数据存储项相同的方式操作动态配置值,动态配置值包含“用户范围的动态配置值” 与 “常规动态配置值”
配置常规动态配置值
常规动态配置值可以由管理员或任何用户配置:
st2 key set <key name> <key value>
# For example
st2 key set private_key_path "/home/myuser/.ssh/my_private_rsa_key"
要查看配置值可以使用命令 st2 key get
st2 key get <key name>
# For example
st2 key get private_key_path
注意:默认情况下 Secret 类型的值将被屏蔽。
配置用户范围的动态配置值
动态配置值可以由每个用户自己配置,也可以由管理员为任何可用的系统用户配置:
st2 key set --scope=user [--encrypt] <key name> <key value>
# For example (authenticated as "user1")
st2 key set --scope=user default_region "us-west-1"
st2 key set --scope=user --encrypt api_secret user1_api_secret
# For example (authenticated as "user2")
st2 key set --scope=user default_region "us-east-1"
st2 key set --scope=user --encrypt api_secret user2_api_secret
# For example (authenticated as administrator, setting a value for "user1" and "user2")
st2 key set --scope=user --user=user1 default_region "us-west-1"
st2 key set --scope=user --user=user2 default_region "us-east-1"
查看值命令时用户只能看到他们自己的值,管理员可以看到所有值,默认情况下秘密被屏蔽
配置的使用
配置可以在 Packs 中的 Python 脚本中全局调用,但需要注意的是,Action 与 Sensor 的 Python 脚本调用有些微差异。
例如我们有一个 pack,名为 config_example,那么配置文件应定义为 config_example.yaml
---
if_host: '10.0.0.26'
if_port: 8086
if_username: 'ifadm'
if_password: 'xxxxxxx'
在 /opt/stackstorm/pack/{packs_name}/actions/ 目录下的 Python 脚本可使用如下方法调用。
host=self.config['if_host']
port=self.config['if_port']
username=self.config['if_username']
password=self.config['if_password']
在 /opt/stackstorm/pack/crontab/sensor/ 中的 Python 脚本,则必需使用下列方法调用。
host=self._config['if_host']
port=self._config['if_port']
username=self._config['if_username']
password=self._config['if_password']
Reference
本文发布于Cylon的收藏册,转载请著名原文链接~
链接:https://www.oomkill.com/2023/05/stackstorm-pack-configuaration/
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。