StackStorm再入門 その1 環境構築

あるお仕事でここ1年くらい、StackStorm(St2)というツールを使っています。アクションを登録しておいて、それを定期的に実行したり、Webhook等で外部から呼び出して使ったり…というツールです。公式サイトを見ると、こんな説明がされています。

  • StackStorm connects all your apps, services, and workflows
  • Robust Automation Engine
  • Integrates with your Existing Infrastructure

「既存の様々なアプリ、サービスなどをつないで、自動化できるエンジン」といったところでしょうか。公式サイトにはIFTTTのようなイメージの紹介もされています。

今のところ、IFTTTのような使い方はしていないのですが、時間指定で自動実行できるという点ではCronとかで管理しているジョブをSt2に任せる(ちゃんと実行ログも取れる)とか、WinRMを使ってWindowsのプログラムも動かせるので、それを使ってWindowsバッチのサーバをLinuxの中央サーバ(ここにSt2が入っている)から管理するといった使い方をしています。

Pythonなどで作った関数を登録して、Webhookなどで呼び出せるという点では、AWSのLambdaの代わりのような使い方も可能性としてはあるかもしれませんね…。

環境構築

そんなSt2なのですが、かなり複雑な構造になっているので、環境構築はなかなか大変です。私の手元の環境では、Hyper-V上の仮想マシンにCentOS7を入れて、それをStackStormの専用環境として使っています。メモリは2GBを割り当てています。(他のLinux環境にはメモリを1GBしか割り当てていないので、ちょっと贅沢な構成です。)

CentOS7へのインストールは、公式ドキュメントどおりで大丈夫です。クライアントマシンなどに開発・実験用に簡単に入れるならDockerを使うという方法も準備されています。

ここでは、私の環境での環境構築ログを残しておこうと思います。(公式ドキュメントどおりですが…)

SELinux

まずは、CentOS7環境でSELinuxが有効になっているか確認します。

getenforce

Enforceになっている場合は、下記の操作が必要です。25672番のポートはこの後で導入するRabitMQが使用します。

sudo yum update
sudo yum install policycoreutils-python
sudo setsebool -P httpd_can_network_connect 1
sudo semanage port --list | grep -q 25672 || sudo semanage port -a -t amqp_port_t -p tcp 25672

ここで一旦再起動します。

必要なソフトウェアの導入

https://docs.stackstorm.com/install/overview.html

アクション等の定義や実行ログはMogoDBとPostgreSQLに格納されます。また、St2のキュー管理のためにRabbitMQも必要です。それぞれインストールしていきます。

sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo rpm --import https://www.mongodb.org/static/pgp/server-3.4.asc
sudo sh -c "cat <<EOT > /etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
EOT"
sudo yum -y install crudini
sudo yum -y install mongodb-org
sudo yum -y install rabbitmq-server
sudo systemctl start mongod rabbitmq-server
sudo systemctl enable mongod rabbitmq-server
sudo yum -y install postgresql-server postgresql-contrib postgresql-devel
sudo postgresql-setup initdb
sudo sed -i "s/\(host.*all.*all.*127.0.0.1\/32.*\)ident/\1md5/" /var/lib/pgsql/data/pg_hba.conf
sudo sed -i "s/\(host.*all.*all.*::1\/128.*\)ident/\1md5/" /var/lib/pgsql/data/pg_hba.conf
sudo systemctl start postgresql
sudo systemctl enable postgresql

St2のインストール

St2は専用のリポジトリから導入します。

curl -s https://packagecloud.io/install/repositories/StackStorm/stable/script.rpm.sh | sudo bash
sudo yum install -y st2 st2mistral

データストアの暗号化を行います。

DATASTORE_ENCRYPTION_KEYS_DIRECTORY="/etc/st2/keys"
DATASTORE_ENCRYPTION_KEY_PATH="${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}/datastore_key.json"
sudo mkdir -p ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}
sudo st2-generate-symmetric-crypto-key --key-path ${DATASTORE_ENCRYPTION_KEY_PATH}
sudo chgrp st2 ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}
sudo chmod o-r ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}
sudo chgrp st2 ${DATASTORE_ENCRYPTION_KEY_PATH}
sudo chmod o-r ${DATASTORE_ENCRYPTION_KEY_PATH}
sudo crudini --set /etc/st2/st2.conf keyvalue encryption_key_path ${DATASTORE_ENCRYPTION_KEY_PATH}
sudo st2ctl restart-component st2api

PostgreSQLのデータベースを作成します。

cat << EHD | sudo -u postgres psql
CREATE ROLE mistral WITH CREATEDB LOGIN ENCRYPTED PASSWORD 'StackStorm';
CREATE DATABASE mistral OWNER mistral;
EHD
/opt/stackstorm/mistral/bin/mistral-db-manage --config-file /etc/mistral/mistral.conf upgrade head
/opt/stackstorm/mistral/bin/mistral-db-manage --config-file /etc/mistral/mistral.conf populate | grep -v -e openstack -e keystone -e ironicclient

ユーザやグループの追加などを行います。stanleyというUnixユーザができます。

sudo useradd stanley
sudo mkdir -p /home/stanley/.ssh
sudo chmod 0700 /home/stanley/.ssh
sudo ssh-keygen -f /home/stanley/.ssh/stanley_rsa -P ""
sudo sh -c 'cat /home/stanley/.ssh/stanley_rsa.pub >> /home/stanley/.ssh/authorized_keys'
sudo chown -R stanley:stanley /home/stanley/.ssh
sudo sh -c 'echo "stanley ALL=(ALL) NOPASSWD: SETENV: ALL" >> /etc/sudoers.d/st2'
sudo chmod 0440 /etc/sudoers.d/st2
sudo sed -i -r "s/^Defaults\s+\+?requiretty/# Defaults +requiretty/g" /etc/sudoers
sudo st2ctl start
sudo st2ctl reload

これで、St2の環境構築ができました。

動作確認

次に、動作確認をしていきます。

st2 --version
st2 action list --pack=core

st2 3.2.0が導入されたことが分かります。また、Python 2.7.5上で動作しています。

St2上で実行するプログラムをアクションといいます。アクションはパックに含まれます。coreパックは標準で導入されるもので、HTTPリクエストやローカルコマンドの実行などのアクションが含まれます。core.remoteアクションを使えば外部サーバのコマンドをSSH経由で実行できますし、core.winrm_cmdではWinRMを使ってWindowsマシンのプログラムを実行することができます。

st2パックのインストール

パックのインストールは下記のように行います。ここでは、St2自体の管理を行うためのアクションなどが含まれるst2パックをインストールします。

st2 pack install st2

Webコンソールのインストール

St2には管理用のコンソール画面が準備されています。Nginx上で動作するWebアプリケーションになっています。

まず、管理ユーザ(st2admin)用のHTTPパスワードを設定します。

sudo yum -y install httpd-tools
echo 'password' | sudo htpasswd -i /etc/st2/htpasswd st2admin

/etc/st2/st2.confを下記のように設定して、HTTPパスワードによる認証を有効にします。

[auth]
# ...
enable = True
backend = flat_file
backend_kwargs = {"file_path": "/etc/st2/htpasswd"}
# ...
sudo st2ctl restart-component st2api

NginxとWebコンソール(st2web)をインストールします。

sudo rpm --import http://nginx.org/keys/nginx_signing.key
sudo sh -c "cat <<EOT > /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/\\\$releasever/x86_64/
gpgcheck=1
enabled=1
EOT"
sudo sed -i 's/^\(enabled=1\)$/exclude=nginx\n\1/g' /etc/yum.repos.d/epel.repo
sudo yum install -y nginx
sudo yum install -y st2web
sudo mkdir -p /etc/ssl/st2
sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/ssl/st2/st2.key -out /etc/ssl/st2/st2.crt -days 365 -nodes -subj "/C=US/ST=California/L=Palo Alto/O=StackStorm/OU=Information \
Technology/CN=$(hostname)"
sudo cp /usr/share/doc/st2/conf/nginx/st2.conf /etc/nginx/conf.d/
sudo sed -i 's/default_server//g' /etc/nginx/nginx.conf
sudo systemctl restart nginx
sudo systemctl enable nginx
sudo firewall-cmd --zone=public --add-service=http --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=http --add-service=https

WebブラウザでSt2をインストールしたサーバのIPアドレス等を開くと、管理コンソールのログイン画面が表示されます。下図はログイン後のトップページです。

これでSt2を使用する準備が整いました。今後の記事で、St2の構造や使い方について説明していこうと思います。

この記事を書いた人

井上 研一

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