StackStorm再入門 その2 構造

昨日、StackStorm(St2)の環境構築について書きました。

St2は様々なアプリやサービスを連携して自動実行するツールで、自動的に動作させたいプログラムと、どのように動作させたいかの定義によって、構成されています。その構造について説明していきたいと思います。

ActionとActionRunner

St2で実行するアプリやサービスはActionとして管理します。”if A then B”のBに相当します。
Actionは何らかのプログラムであり、そのプログラムの実行環境としてActionRunnerがあります。Actionは標準で提供されているものの他に、独自のActionを作成することができます。ActionRunnerは標準で提供されているものから選んで使用します。

ActionRunnerには下記のようなものがあります。(一部)

  • local-shell-cmd ローカルコマンドを実行する
  • python-script Pythonスクリプトをローカルで実行する
  • remote-shell-cmd SSH経由でリモートのコマンドを実行する
  • winrm-cmd WinRM経由でWindowsのコマンドを実行する
  • winrm-ps-cmd WinRM経由でWindowsのPowerShellを実行する
  • http-request HTTPリクエストを実行する
  • action-chain 複数のアクションを順序どおりに実行する

標準のActionには下記のようなものがあります。(一部)

  • core.local local-shell-cmdを使ってローカルコマンドを実行する
  • core.local_sudo local-shell-cmdを使ってローカルコマンドをsudoで実行する
  • core.remote remote-shell-cmdを使ってリモートのコマンドを実行する
  • core.remote_sudo remote-shell-cmdを使ってリモートのコマンドをsudoで実行する
  • core.sendmail local-shell-cmdを使ってメールを送信する
  • core.http http-requestを使ってHTTPリクエストを実行する
  • core.winrm_cmd winrm-cmdを使ってWindowsのコマンドを実行する
  • core.winrm_ps_cmd winrm-ps-cmdを使ってWindowsのPowerShellを実行する

このように、ActionRunnerは実行環境であり、それを使って(その上で)Actionに定義されたコマンド等を動かすということがわかると思います。もちろん、local-shell-cmdというActionRunnerを使って、独自のシェルスクリプトなどを動かすActionを定義したりすることもできます。python-scriptというActionRunnerはPythonの実行環境を提供するものです。Pythonスクリプトを動作させるための仮想環境(virtualenv:仮想環境ごとに異なるパッケージを導入することができる)は、Action単位ではなくActionやTriggerなどをまとめたPackの単位で構築することができます。

St2の定義ファイルはyaml形式で、Action(core.local)の定義はこのようなものです。

---
description: Action that executes an arbitrary Linux command on the localhost.
enabled: true
entry_point: ''
name: local
parameters:
  cmd:
    description: Arbitrary Linux command to be executed on the local host.
    required: true
    type: string
  sudo:
    immutable: true
runner_type: "local-shell-cmd"

TriggerとWebhook、Sensor

TriggerはActionを呼び出すためのきっかけとなるもので、”if A then B”のAに相当します。

標準のTriggerには、下記のようなものがあります。(一部)

  • core.st2.CronTimer
  • core.st2.DateTimer
  • core.st2.IntervalTimer
  • core.st2.action.file_writen
  • core.st2.sensor.process_exit
  • core.st2.webhook
  • linux.file_watch.line

CronTimerDateTimerIntervalTimerは時間に関するTriggerです。CronTimerでは、UNIX系OSで用いられるCronと同じように日時やその間隔を定義することができます。

webhookは外部からのWeb APIによる呼び出しを処理するTriggerです。後で説明するRuleの定義は不要で、直接Actionを実行できます。(St2APIを使用すればActionを直接起動することもできるので、Webhookはその一種のようにも見えます。)

file_writenfile_watch.lineのようにファイルの生成や更新を監視できるTriggerもあります。また、process_exitはシステムプロセスの終了を監視します。

Sensorは外部システムなどの監視を定期的に行って、Triggerを呼び出すPythonスクリプトです。
標準では、linux.FileWatchSensorが提供されています。このSensorの定義の内部で、先ほど例示したlinux.file_watch.lineというTriggerが定義されており、SensorのPythonスクリプトから定義されたTriggerに処理を呼び出します(ディスパッチ)。

StackStorm Exchangeで提供

---
  class_name: "TwitterSearchSensor"
  entry_point: "twitter_search_sensor.py"
  description: "Sensor which monitors twitter timeline for new tweets matching the specified criteria"
  poll_interval: 30
  trigger_types:
    -
      name: "matched_tweet"
      description: "Trigger which represents a matching tweet"
      payload_info:
        - "id"
        - "created_at"
        - "lang"
        - "place"
        - "retweet_count"
        - "favorite_count"
        - "user"
        - "text"
        - "url"

Rule

最後にRuleです。Ruleは上のキャプチャで見ると分かるように、”if A then B”を定義して、TriggerとActionを紐付けます。定義ファイルは下記のようなものです。core.st2.generic.notifytriggerというTriggerが起動した場合、criteriaで指定された条件を満たしていれば、actionに定義したActionを実行します。

---
name: "notify"
pack: "chatops"
enabled: true
description: "Notification rule to send results of action executions to stream for chatops"
trigger:
  type: "core.st2.generic.notifytrigger"
criteria:
  trigger.route:
    pattern: "hubot"
    type: "equals"
action:
  ref: chatops.post_result
  parameters:
    channel: "{{trigger.data.source_channel}}"
    user: "{{trigger.data.user}}"
    execution_id: "{{trigger.execution_id}}"
    context: "{{trigger.data.source_context}}"

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。2018年、株式会社ビビンコを北九州市に創業。IoTソリューションの開発・導入や、画像認識モデルを活用したアプリの開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。