StackStorm再入門 その3 パックとアクションを作る

StackStorm再入門その2までで、Vagrant+VirutalBox環境上のCentOS7にStackStorm(St2)を導入し、St2の構造についても説明しました。

今回は、St2活用の基本ということで、パックとアクションの作り方を説明します。

パックの作成

パックは、St2のアクションやトリガーといった構成要素をまとめて管理するための単位です。公開されているパックをインストールすることもできるし、自分でパックを作成することもできます。

パックを作成するには、Pythonのst2sdkパッケージを使うと便利です。ここでは、St2本体でも使用しているCentOS7標準のPython2環境に導入していきます。

まずは、Pythonのパッケージ管理ツールであるpipをyumで導入します。

sudo yum install python2-pip

そのpipを使って、st2sdkをインストールします。

sudo pip install st2sdk

パックの作成は簡単です。いまインストールしたst2sdkのbootstrapコマンドでパック名(ここではhello)を指定するのみです。

cd /vagrant
st2sdk bootstrap hello

helloというディレクトリに、下図のような構造でファイルとディレクトリが作成されます。

自動生成されたpack.yamlはこのようになっています。パック名と、後はバージョン名などのメタ情報です。refの値は、後でパックを指定する際に使用します。

---
name: hello
ref: hello
description: ''
version: 0.1.0
author: John Doe
email: john.doe@example.com

パックは、/opt/stackstorm/packs配下に置くので、ここではシンボリックリンクを作成します。

ln -s /vagrant/hello /opt/stackstorm/packs/hello

アクションの作成

St2のアクションは、定義ファイルのyamlと実体のプログラムという構成で作成します。actions/echo.yamlを作成し、下記のようにします。

---
name: hello_echo
pack: hello
runner_type: local-shell-script
entry_point: echo.sh
description: hello echo action
enabled: true
parameters:
    name:
        type: string
        default: 'John'

今回はシェルスクリプト(entry_pointの値としてスクリプト名を指定)が実行したいアクションの本体なので、ActionRunner(runner_type)としてlocal-shell-scriptを指定します。
parametersの値はアクションを実行する際の引数です。nameという名前のパラメータを定義し、その型がstringであり、デフォルト値がJohnであることを指定します。

次に、実行したいシェルスクリプトをactions/echo.shに作成します。
極めて単純なものですが、下記のようにしました。

#!/bin/sh
echo "Hello, $1!"
exit 0

St2にログイン

St2 CLIのコマンドを実行する前に、St2にログインします。--write-passwordを指定することで、以後、自動的にログインすることができます。

st2 login st2admin --write-password

パックの登録

ここまで作成したら、作成したパックをSt2に登録します。パックに含まれるアクションも自動で登録されます。

cd /opt/stackstorm/packs
st2 pack register hello

ちなみに、パックを登録した後にアクションを追加する場合は、st2 action createというコマンドを使用し、引数としてアクションの定義ファイル(yaml)のパスを指定します。

st2 action create hello/actions/echo.yaml

アクションの定義ファイルを更新した場合は、st2 action updateコマンドの引数にアクションのrefの値と、アクションの定義ファイルを指定します。(アクションの定義ファイルを変えずに、実行したいシェルスクリプトの中身だけが変わる場合は特に何もする必要はありません。

st2 action update hello.echo hello/actions/echo.yaml

アクションの実行

st2 action executeで、アクションを実行してみましょう。st2 action executeコマンドの引数としてアクションのrefの値を指定します。

st2 action execute hello.echo

St2のWebコンソールからアクションの実行ログを見ると、このように表示されました。シェルスクリプトには引数の値が--name=Johnのように引き渡されるようです。

シェルスクリプトを変更

引数の値だけを取得できるようにシェルスクリプトを少し変更しました。(かなり適当な実装ですが・・・。)
先ほど述べたように、実行するシェルスクリプトの中身が変わっただけの場合は、特に何もしなくてもSt2に反映されます。

#!/bin/sh
name=${1:7}
echo "Hello, $name!"
exit 0

アクションの引数は、このように引数名と値をイコールでつないで指定します。

st2 action execute hello.echo name="Ken"

このように、望んだ結果が得られました。

この記事を書いた人

井上 研一

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