配置指南

无论是在真实的 OpenStack 环境中还是没有 OpenStack 环境的情况下,都需要 Mistral 配置才能使 Mistral 正常工作。

注意: 以下大多数操作应在 mistral 目录下执行。

  1. 生成 mistral.conf(如果它不存在)

    $ oslo-config-generator \
      --config-file tools/config/config-generator.mistral.conf \
      --output-file /etc/mistral/mistral.conf
    
  2. 编辑文件 /etc/mistral/mistral.conf

  3. 如果您不使用 OpenStack,请跳过此项。 提供有效的 keystone 认证属性

    [keystone_authtoken]
    www_authenticate_uri = http://keystone1.example.com:5000/v3
    identity_uri = http://<keystone-host:5000
    auth_version = v3
    admin_user = <user>
    admin_password = <password>
    admin_tenant_name = <tenant>
    
  4. Mistral 也可以配置为通过 OpenID Connect 协议与 Keycloak 服务器进行身份验证。为了启用 Keycloak 身份验证,配置文件中应包含以下部分

    auth_type = keycloak-oidc
    
    [keycloak_oidc]
    auth_url = https://<keycloak-server-host>:<keycloak-server-port>/auth
    

    默认情况下,属性 auth_type 分配给 keystone。如果需要禁用 SSL/TLS 验证,则应在 [keycloak_oidc] 组下添加 insecure = True

  5. 如果您想为 Mistral API 服务器配置 SSL,请在配置文件中提供以下选项

    [api]
    enable_ssl_api = True
    
    [ssl]
    ca_file = <path-to-ca file>
    cert_file = <path-to-certificate file>
    key_file = <path-to-key file>
    
  6. 如果您不使用 OpenStack 或想要禁用 Mistral 服务的身份验证,请在配置文件中提供 auth_enable = False

    [pecan]
    auth_enable = False
    
  7. 如果您不使用 OpenStack,请跳过此项。 在 Keystone 上注册 Mistral 服务和 Mistral 端点

    $ MISTRAL_URL="http://[host]:[port]/v2"
    $ openstack service create workflowv2 --name mistral \
      --description 'OpenStack Workflow service'
    $ openstack endpoint create workflowv2 public $MISTRAL_URL
    $ openstack endpoint create workflowv2 internal $MISTRAL_URL
    $ openstack endpoint create workflowv2 admin $MISTRAL_URL
    
  8. [DEFAULT] 部分配置传输属性

    [DEFAULT]
    transport_url = rabbit://<user_id>:<password>@<host>:5672/
    
  9. 配置数据库。 生产环境中不能使用 SQLite;请使用 MySQL 或 PostgreSQL。 以下是如何将 MySQL 数据库连接到 Mistral 的步骤

    确保您已在数据库机器上安装 mysql-server 包(它也可以是您的 Mistral 机器)。

    安装 Python 的 MySQL 驱动程序

    $ pip install PyMySQL
    

    创建数据库并授予权限

    # mysql
    
    CREATE DATABASE mistral;
    USE mistral
    GRANT ALL ON mistral.* TO 'root'@<database-host> IDENTIFIED BY <password>;
    

    在 Mistral 配置文件中配置连接

    [database]
    connection = mysql+pymysql://<user>:<password>@<database-host>:3306/mistral
    

    注意:如果使用 PostgreSQL,请按以下方式配置连接项

    connection = postgresql://<user>:<password>@<database-host>:5432/mistral
    
  10. 如果您不使用 OpenStack,请跳过此项。 更新 mistral/actions/openstack/mapping.json 文件,该文件包含所有允许的 OpenStack 操作,根据部署中 OpenStack 项目的特定客户端版本进行更新。请在 tools/get_action_list.py 脚本中找到更多详细信息。

  11. 如果需要,配置合并策略功能。它需要更改 Mistral 变量交互的默认行为,即在自己的上下文中用另一个变量替换一个变量。例如

    version: '2.0'
    wf:
    input:
    - aa:
          bb: wf_ex_input
          cc: wf_ex_input
          zz: wf_ex_input
    output:
       aa: <% $.aa %>
    tasks:
       task1:
          action: std.echo
          # emulate some action result
          input:
          output:
             cc: task1_res
             dd: task1_res
          on-success: [task2]
          publish:
          aa:
             cc: <% task().result["cc"] %>
             dd: <% task().result["dd"] %>
       task2:
          action: std.echo
          # emulate some action result
          input:
          output:
             bb: task2_res
          publish:
          aa:
             bb: <% task().result["bb"] %>
    

    执行的默认结果是

    {
       "aa": {
          "bb": "task2_res"
       }
    }
    

    要合并任务的结果,我们需要使用扁平数据结构或 yaql 合并函数。merge_strategy 配置具有以下选项

    • replace - 这是默认值。这是变量在上下文中相互替换的旧行为。

    • merge - 如果您设置此值,变量将与其他上下文合并。

    考虑使用与上述相同的工作流 merge 策略。结果是

    {
       "aa" : {
          "bb": "task2_res",
          "cc": "task1_res",
          "dd": "task1_res",
          "zz": "wf_ex_input",
       }
    }
    

    可以按以下方式配置 merge_strategy

    [engine]
    merge_strategy = replace
    
  12. 如果需要,配置任务亲和性功能。它需要区分单个任务执行器或来自任务执行器组的一个任务执行器

    [executor]
    host = my_favorite_executor
    

    然后,可以在工作流语言中通过以下方式引用此执行器

    ...Workflow YAML...
    my_task:
      ...
      target: my_favorite_executor
    ...Workflow YAML...
    
  13. 配置 Mistral 端点的基于角色的访问策略 (policy.yaml)

    [oslo_policy]
    policy_file = <path-of-policy.yaml file>
    

    默认 policy.yaml 文件位于 mistral/etc/。有关更多详细信息,请参见 policy.yaml 文件

  14. 如果需要,修改日志配置

    默认日志格式与 Graylog 兼容,但是可以配置日志格式。Mistral 使用库 oslo.log 进行日志记录。有关配置信息,请参阅官方 oslo.log 配置:https://docs.openstack.org/oslo.log/2025.2/configuration/index.html。您可以按如下方式使用 root_execution_id

    logging_context_format_string = [%(asctime)s,%(msecs)03d][%(levelname)-5s][category=%(name)s][pid=%(process)d][root_execution_id=%(root_execution_id)s] %(message)s
    
  15. 如果需要,修改操作执行报告配置。

    操作可能会卡在 “RUNNING” 状态,例如,如果分配的执行器崩溃或发出操作完成信号的消息丢失。本节描述了一种基于心跳的解决方案来关闭这些被遗忘的操作执行。相关的配置选项是 max_missed_heartbeatscheck_interval。请注意,如果这两个选项中的任何一个为 “0”,则该功能将不会启用。

    默认配置如下

    [action_heartbeat]
    max_missed_heartbeats = 15
    check_interval = 20
    first_heartbeat_timeout = 3600
    

    “check_interval = 20”,因此每 20 秒检查一次操作执行。当检查器运行时,如果收到的最后一个心跳时间早于 “20 * 15” 秒,它将把所有正在运行的操作执行转换为错误。请注意,“first_heartbeat_timeout = 3600”,因此如果未收到心跳,操作执行在 3600 秒内不会关闭。

    • max_missed_heartbeats

    定义允许的最大未收到心跳数。如果未收到心跳数超过此数字,则相关操作执行将转换为 “ERROR” 状态,原因 “Heartbeat wasn’t received.”

    • check_interval

    检查间隔(以秒为单位)。

    • first_heartbeat_timeout

    第一个心跳的宽限期(以秒为单位)。

  16. 默认情况下,Mistral 会记录 HTTP 操作中的请求信息。要隐藏请求标头和端点响应中的日志,请应用如下配置

    [action_logging]
    hide_response_body = True
    hide_request_body = True
    sensitive_headers = Header1, Header2
    

    上面的示例将使 Mistral 隐藏响应的所有主体,并隐藏 Mistral 执行器日志中请求中的 Header1 和 Header2。

    • hide_response_body

    如果此值为 True,则 HTTP 操作响应主体将在日志中隐藏。默认值为 False

    • hide_request_body

    如果此值为 True,则 HTTP 操作请求主体将在日志中隐藏。默认值为 False

    • sensitive_headers

    应在日志中隐藏的敏感标头列表。默认情况下为空。

  17. 配置事件发布者。事件发布者是可选地安装在与 Mistral 相同的虚拟环境中的插件。可以为所有工作流执行配置一个或多个事件发布者的事件通知。配置位于通知器部分中的 notify 参数下。notify 参数是一个字典列表,每个发布者一个,用于标识类型或注册的插件名称以及作为 kwargs 传递给发布者的其他键值对

    [notifier]
    notify = [ {"type": "webhook", "url": "http://example.com", "headers": {"X-Auth-Token": "XXXX"}}, {"type": "custom_publisher"} ]
    
  18. 配置信息端点。信息端点可用于以 json 格式公开一些重要的支持数据。应手动启用此端点。将填写的信息文件存储到 Mistral 将运行的环境中。

    默认配置如下

    [api]
    enable_info_endpoint = False
    info_json_file_path = info.json
    
  19. 最后,尝试运行 mistral 引擎并验证它是否在没有错误的情况下运行

    $ mistral-server --config-file <path-to-config> --server engine