サポートの作業を自動化していく（第二回 StackStorm編）

# はじめに
第一回目はAnsibleとDockerを使って、DBセットアップを自動化しました。今回はそれを拡張し、StackStormからAnsibleのPlaybookを叩ける様にします。

# 背景と目的
## 背景
前回は、Ansible Playbookを使ってDBコンテナの立ち上げとSQL Dumpの取り込みを自動化しました。しかし、まだansible-playbookコマンドをLinux CUIで叩く必要があります。

### 現段階でのDB立ち上げの手順
+ Linuxサーバへのログイン
+ コールセンターからの連絡を元に、設定ファイルの作成
+ 設定ファイルを引数としたPlaybookの実行

まだ、ログインしたり設定ファイルを作ったりと手間がかかります。

## 目的
ログインと設定ファイル作成の手間を省き、GUIで作業できるようにStackStormをフロントエンドとして立ち上げていきます。

### 今回やること
+ Docker版StackStormの立ち上げ
+ StackStormへのPackのインストールの自動化
+ StackStormのWorkflowの取り込みの自動化

### 今回はやらないこと
+ 独自Dockerイメージの作成

# 手順
## Docker版StackStormの立ち上げ
Docker版StackStormの立ち上げは以下の記事を参照に実施しています。
ここでは自分が躓いた箇所と、自分なりの設定の取り込みを記載します。
https://qiita.com/shusugmt/items/18b5f4e44c720aae47ae

1.　StackStormイメージの取得
githubよりst2-dockerのパッケージを取得します。
この中に含まれる設定ファイルを用いて、docker-composeのStackStormを立ち上げます。

```stackstorm:gitからのコピー
# git clone git@github.com:stackstorm/st2-docker
```

2.　st2-dockerの設定変更

st2-docerの立ち上げで一回躓きました。
コピーしてきたdocker-compose.ymlファイルに記載されているStackStormのイメージのTag指定で蹴られます。
内容を見るとLatest指定となっていますので、このままトラブルシューティングをするのではなく、安定版（と聞いている）2.7系を指定して利用することにします。`image: stackstorm/stackstorm:2.7`

また、作成したAnsible PlaybookとWorkflowのYAMLファイルを取り込むため、ローカルファイルをst2-dockerへマウントします。

``` docker-compose:ファイルのマウント
    volumes:
      - /home/kannosan/ansible-playbook:/root/ansible-playbook # mount playbook
      - /home/kannosan/rcp-pack:/root/rcpsupport # mount pack
```

ついでに標準ではHTTPSでの接続となりますが、HTTPからのリダイレクトも有効化されているので、Port 80も有効化しておきます。

``` docker-compose:Port Forward設定
    ports:
      - "443:443"
      - "80:80" #Redirect http
```

まとめると以下のファイルが出来上がります。

```stackstorm:docker-compose.yml
services:
  stackstorm:
    #image: stackstorm/stackstorm:${TAG:-latest}
    image: stackstorm/stackstorm:2.7
    env_file:
      - conf/stackstorm.env
      - conf/mongo.env
      - conf/rabbitmq.env
      - conf/postgres.env
      - conf/redis.env
    ports:
      - "443:443"
      - "80:80" #Redirect test
    networks:
      - public
      - private
    volumes:
      - stackstorm-packs-volume:/opt/stackstorm/packs
      - stackstorm-virtualenvs-volume:/opt/stackstorm/virtualenvs
      - stackstorm-configs-volume:/opt/stackstorm/configs
      - stackstorm-log-volume:/var/log
      - ./packs.dev:/opt/stackstorm/packs.dev
      - ./runtime/entrypoint.d:/st2-docker/entrypoint.d
      - ./runtime/st2.d:/st2-docker/st2.d
      - ./conf/stackstorm.env:/st2-docker/env
      - /home/kannosan/ansible-playbook:/root/ansible-playbook # mount playbook
      - /home/kannosan/rcp-pack:/root/rcpsupport # mount pack
    dns_search: .
```

3.　st2-dockerの立ち上げ
StackStormを立ち上げます。
以下のコマンドはdocker-compose.ymlファイルが置いてあるディレクトリ以下で実行しましょう。
なお、StackStormの標準のUser/Passwordはst2-docker/conf/stackstorm.envに記載されています。必要に応じて編集してください。

```docker-compose:コンテナの立ち上げ
# docker-compose up -d
```

4.　PackのインストールとWorkflowファイルの取り込み
前の項目までで、StackStormの立ち上げまではできました。
ただし、このままではAnsible Packが入っていなかったり、Workflowファイルが取り込まれていないため、Ansible Playbookを叩くことができません。
Playbookを叩くために、それらの作業を実施していきます。
本来であればPackをインストールしてDocker Image化すると良さそうな感じですが、今回はStackStorm立ち上げ後にWorkflowの取り込みを行うため、スクリプトで実施します。

以下のスクリプトでは、Ansible Packを使うためのlibkrb5のインストールと、Ansible Packのインストール、そして、Workflowファイルが保存されている/root/rcpsupportディレクトリをStackStormのPackがインストールされる/opt/stackstorm/packsディレクトリへSymbolic Linkを貼る作業を行っています。

```stackstorm:install_packs.yml
#! /bin/sh

docker-compose exec stackstorm apt-get install libkrb5-dev -y
docker-compose exec stackstorm st2 login st2admin -p <password> --write-password
docker-compose exec stackstorm st2 pack install ansible
docker-compose exec stackstorm ln -s /root/rcpsupport /opt/stackstorm/packs/rcpsupport
docker-compose exec stackstorm st2ctl reload
```
ここまでで、StackStormからAnsible Playbookを叩く準備ができました。
早速、WebGUIからStackStormへログインしてDBを立ち上げてみましょう…

```stackstorm:ERROR
"error": "RemoteError: Remote error: UnicodeEncodeError 'ascii' codec can't encode characters in position 21-27: ordinal not in range(128)
```
が、ここでトラブルが発生しました。
Unicodeのエラーなので、コールセンターから貰った日本語を含む共有フォルダパスがダメそう…

# 課題
StackStormは立ち上がりましたが、Unicodeで躓きました…
`# update-locale LANG=ja_JP.UTF-8`も効いてない感じなのでトラブルシュートが必要です…
ここさえ解決できれば、WebGUIからDB立ち上げができるはず…

# まとめ/次回予告
webhookへ向かうKanno-sanを待っていたのはまた、地獄だった。英語圏のソフトウェアに棲み着いたLang=en_US.UTF-8。日本語処理は絶望に沈む。次回「locale」。Lang=ja_JP.UTF-8を通す術はあるか？