あるお仕事でここ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
ここで一旦再起動します。
必要なソフトウェアの導入
アクション等の定義や実行ログは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 < /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 < /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の構造や使い方について説明していこうと思います。