本文发布于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

[1] Pack Configuration

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

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

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