2020.07.29 · 技術と道具

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

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

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

パックの作成

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

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

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

BASH
sudo yum install python2-pip

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

BASH
sudo pip install st2sdk

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

BASH
cd /vagrant
st2sdk bootstrap hello

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

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

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

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

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

アクションの作成

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

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に作成します。
極めて単純なものですが、下記のようにしました。

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

St2にログイン

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

BASH
st2 login st2admin --write-password

パックの登録

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

BASH
cd /opt/stackstorm/packs
st2 pack register hello

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

BASH
st2 action create hello/actions/echo.yaml

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

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

アクションの実行

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

BASH
st2 action execute hello.echo

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

シェルスクリプトを変更

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

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

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

BASH
st2 action execute hello.echo name="Ken"

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

2020/07/29 17:30
← MacBook Pro 13インチ 2019年モデルと202…
IoTはローカルビジネスであるという話 →
井上 研一
経済産業省推進資格ITコーディネータとして中小企業のDX・AI活用の現場で伴走支援を行う。「ITCプロセスガイドライン4.0」および「中小企業向けAI活用ガイド」執筆メンバー。著書・講演多数。ITエンジニアとして25年以上の実務経験。AI導入の実務に10年以上携わる。自ら開発したAIサービス「Gen2Go」が北九州発!新商品創出事業の認定を受ける。2026年4月より北九州市立大学大学院マネジメント研究科の学生としての顔も持つ。

本サイトおよびブログに掲載している内容は、特に明記のない限り、井上研一個人の見解に基づくものです。所属・関与する組織、団体、企業、研究会等の公式見解を示すものではありません。