StackStorm(St2)の再入門記事を時折書いていて、インストール、構造の説明、パックとアクションの作成というように話を進めてきました。
アクションの作成は前回はシェルスクリプトで説明したのですが、機能が不十分と感じることが多いでしょう。そこで、今回はPythonスクリプトをアクションとして使う方法を説明します。
今回は、気象庁が提供するデータを取得して、最新の情報を1件取得するプログラムをサンプルとして作ります。
パックとアクションの説明でも行ったように、St2のアクションは実体のスクリプトと、yamlで書いた定義ファイルの2つを作成する必要があります。
まず、yamlファイルは下記のようにします。ここでは、helloという作成済みのパックにアクションを追加することとして、packs/hello/actions/weather.yaml
を作成します。
---
name: "weather"
pack: "hello"
runner_type: "python-script"
description: "weather info from jma"
enabled: true
entry_point: "weather.py"
parameters:
title:
type: "string"
required: true
position: 0
基本的にはシェルスクリプトの時と同じような定義ファイルですが、違うのはrunner_type
としてpython-script
と指定している点です。
次に、Pythonスクリプトを作成します。packs/test/actions/weather.py
を下記のようにします。St2のアクションとして動作させるPythonスクリプトは、st2actions.runners.pythonrunner.Action
を継承したクラスとする必要があります。クラス名は何でも良いようです。そのクラスに定義したrun
という関数が実行されます。St2から引き渡されたパラメータは、run
関数の引数になります。
戻り値は、処理が成功したか否かを示す真偽値と、St2に戻したい値のセットとします。
import feedparser
from st2actions.runners.pythonrunner import Action
class PythonTest(Action):
def run(self, title):
result = None
feed = feedparser.parse('http://www.data.jma.go.jp/developer/xml/feed/regular.xml')
for entry in feed['entries']:
if entry['title'] == title:
result = entry
break
if result:
return (True, {
'author': result['author'],
'summary': result['summary']
})
else:
return (False, None)
St2のアクションとしてPythonスクリプトを動作させる場合、パックごとにPythonの仮想環境が作成し、その中で動作させます。
Pythonスクリプト内で使用したいパッケージがある場合、パックのルートディレクトリpacks/test
にrequirements.txt
を作成します。
今回は、feedparser
パッケージを使っているので、requirements.txt
の内容は下記のとおりとなります。
feedparser
下記のコマンドを実行し、Pythonの仮想環境を作成します。ここで、requirements.txt
に記述したパッケージのインストールも行われます。(一度、仮想環境を作った後で、requirements.txt
にパッケージを追記等した場合、再度このコマンドを実行すれば良いようです。)
st2 run packs.setup_virtualenv packs=hello
後は、通常どおりアクションをSt2に登録します。
st2 action create hello/actions/weather.yaml
CLIでアクションを実行する場合、下記のようにします。
st2 action execute hello.weather title='府県天気概況'
このようにPythonスクリプトが実行され、最新の気象情報を得ることができました。