サポートの作業を自動化していく（第三回 StackStormチューニング編）

# はじめに
第二回目はDocker版のStackStormを立ち上げを行いましたが、文字コードの壁で躓いていました。

# 背景と目的
## 背景
前回は、Docker版StackStormでAnsible Packを使おうとした際にファイルパスに日本語が含まれており、エラーで弾かれていました。
今回はこれを回避し、StackStormからAnsible Playbookを動かします。

### 現段階での課題
+ Docker版StackStormの文字コード問題
+ Docker版StackStormでのAnsible Pack動作確認
+ DockerコンテナからのAnsible実行

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

### 今回やること
+ 文字コード問題の回避（力技、運用で回避）
+ Docker版StackStormでAnsible Packを動作させるために必要なパッケージのインストール
+ コンテナからのAnsible実行に必要な設定の追加

### 今回はやらないこと
+ 独自Dockerイメージの作成
+ 文字コード問題の根本解決（根が深い…）

# 手順
## 文字コード問題の回避（力技）
コールセンターから共有されるログファイルのフォルダパスは以下のようなフォーマットとなっています。
\\サーバ名\share\お客様取得ログ\<製品種別>\<お客様名>\<ケースID>\yyyymmdd
今回の動作では「お客様取得ログ」、「<製品種別>」に日本語が含まれていました。
お客様名は幸いなことにアルファベット表記で統一されていました。 

日本語フォルダ名を徹底排除していきます（力技）

1.　入力パラメータの変更
第一回目のAnsible Playbookではコールセンターから送られてきたフォルダパスをすべて入力パラメータとし、
ローカルパスへ置換していました。
こちらをお客様名以下のフォルダをローカルのマウントポイントと結合する方法へ変更します。

```ansible:もとのコード
replace_path: '{{ base_path | regex_replace("\\","/") }}'
samba_path: '{{ replace_path | replace("//IPアドレス/share/お客様取得ログフォルダ","/mnt/logs") }}'
```

```ansible:変更後のコード
replace_path: '{{ base_path | regex_replace("\\","/") }}'
samba_path: "/mnt/logs/{{ replace_path }}"
```

## Docker版StackStormでAnsible Packを動作させるために必要なパッケージのインストール
Ansible Packの動作確認をしていくと、cryptographyが無いよとのエラーが出てきます。
StackStormのAnsibleは/opt/stackstorm/virtualenvs/ansible以下にあるため、virtualenvにcryptgraphyをインストールする必要があります。

1.　パッケージの追加方法

```docker:virtualenvへのパッケージ追加
docker-compose exec stackstorm /opt/stackstorm/virtualenvs/ansible/bin/pip install cryptography==2.2.2
```


参考：https://tekunabe.hatenablog.jp/entry/2018/05/19/st2_ansible_pip

これでAnsible Packは動くようになりました。

## コンテナからのAnsible実行に必要な設定の追加
利用するAnsible Playbookを動作させるホストと同一のホストでDocker版StackStormを動かしています。
ただし、Ansibleからみるとそれぞれ別のホストとして扱われます。
第一回で作成したPlaybookのInventory設定を調整する必要があります。

1.　Inventoryの設定
もともとのコードでは横着して、ローカルアドレスを指定していました。
これではコンテナ外のホストへアクセスできないので修正します。

なお、IPアドレス指定だとホストが無いものとして扱われてしまうようなので、ちゃんとInventory設定をします。
Docker版のStackStormで以下の設定を追加します。

```ansible:/etc/ansible/hosts
[dockerhost]
<ローカルホストのIPアドレス>
```

2. Keypairの設定
SSHでの接続となるのでKeypair設定が必要となります。
ローカルホストからDocker版StackStormへKeypair設定します。
この時、公開鍵のコピー、Known_hostsの追加も自動で行います

```docker-compose:Keypair設定
docker-compose exec stackstorm ssh-keygen -q -t rsa -f /root/.ssh/id_rsa -N ""
docker-compose exec stackstorm cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
docker-compose exec stackstorm sh -c "ssh-keyscan -H <ローカルホストのIPアドレス> >> /root/.ssh/
known_hosts"
```

ここまでできたら、Docker版StackStormを立ち上げたあとに実行するスクリプトに追記します。

```docker-compose:install_packs.yml
#! /bin/sh

docker-compose exec stackstorm apt-get install libkrb5-dev -y
docker-compose exec stackstorm st2 login st2admin -p 6IrPJtM9 --write-password
docker-compose exec stackstorm st2 pack install ansible
docker-compose exec stackstorm ln -s /root/rcpsupport /opt/stackstorm/packs/rcps
upport
docker-compose exec stackstorm st2ctl reload
docker-compose exec stackstorm /opt/stackstorm/virtualenvs/ansible/bin/pip insta
ll cryptography==2.2.2
docker-compose exec stackstorm ssh-keygen -q -t rsa -f /root/.ssh/id_rsa -N ""
docker-compose exec stackstorm cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorize
d_keys
docker-compose exec stackstorm sh -c "ssh-keyscan -H <ローカルホストのIPアドレス> >> /root/.ssh/
known_hosts"
docker-compose exec stackstorm mkdir /etc/ansible
docker-compose exec stackstorm sh -c 'echo "[dockerhost]" >> /etc/ansible/hosts'
docker-compose exec stackstorm sh -c 'echo "<ローカルホストのIPアドレス>" >> /etc/ansible/hosts'
```

これでStackStormとAnsible Playbookの準備はできました。
以後は誰でも（パラメータさえ知っていれば）GUIからDBのコンテナを立ち上げられます。

# 残課題
日本語の文字コードが通らない事象は今後もどこかで躓きそうなので、直しておきたいところです…
また、ここまで書いて気づきましたが、Workflowの詳細を書き忘れていました。

# まとめ/次回予告
シリーズが終わったと思っていたKanno-sanを待っていたのは、事前準備の残党だった。姿が見せないWorkflow詳細が次回の記事投稿を急かす。
次回「Workflow」。削除処理の紹介も迫られる。