リモワでのDevOpsパワーを最大化するためにslackをシェルプロンプトにしたぜ！(v1.0！)

# 他人に使ってもらうと本当に参考になるなぁ。。

というアプデを繰り返して、もうちょっとで本運用までかこつけた！

# つまり、こういうの！

![2](https://user-images.githubusercontent.com/22161385/110207729-d0687e00-7ec8-11eb-8a82-d9bb248f92ed.gif)

# 解決したい課題

### slackでDevもOpsも集まってリモワ仕事してるとこういう事ないですか？

「なんか、このログ気になりますね。。/var/xxxでこのエラーコードでgrepしてもらえますか？」

えっちらおっちら　※ログイン→コマンド叩く→必要個所切り出す→slackに貼る

「すみません、エラーコード間違ってました！正しくはxxです」

えっちらおっちら

「切り出した期間が狭いんで、出てくるの全部貼ってもらえますか？」

えっちらおっちら

「度々すみません、さっき再発したので同じのもう一回調べてもらえますか？」

**ぴええええええええん**ってなって上司に相談すると

「開発にログイン権限渡したくなくて、、面倒だけどゴメンね」

～END～

### というのをUXを解消してくれるのが、このツール！

先日作った[slackの操作をシェルプロっぽくするツール。あとショートカットで文字送ったり](https://github.com/yasutakatou/slackops)<br>
と組み合わせると効果絶大です！（たぶん）

# 居場所

ここです！
<a href="https://github.com/yasutakatou/slabot"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/yasutakatou/slabot.png" width="460px"></a>

### v0.3

- Windows対応(クライアント／ボット両方)
	- Windowsバイナリに対応と、あわせてコマンド投げ込み先をWindows対応にしました

![wintarget](https://user-images.githubusercontent.com/22161385/111068235-4db87200-850b-11eb-87c2-c88ddee7d320.png)

- ソケットモード対応
	- **これでngrokとかでインバウント通信を開けなくて良くなりました！**
- コンフィグファイルの変更を検知してホットリロード
	- コンフィグファイルに変更があった場合に自動的に再読み込みします
- 実行者の名前を出力する
	- 実行者が多数いると埋もれてしまうので、命令した人にメンション入れるようにしました
- aliasコマンドをつける
	- 長ったらしいコマンドを短縮登録できるようにしました

![alias1](https://user-images.githubusercontent.com/22161385/111068228-485b2780-850b-11eb-8c7d-0b808352882a.png)
![alias2](https://user-images.githubusercontent.com/22161385/111068233-4a24eb00-850b-11eb-934b-d385eba8e51d.png)

- ログ出力をつける
	- systemdに登録した時にログが残しずらいのでログ出力モードをつけました 

### v0.4

- 設定をエクスポートして永続化<
	- アクセス先やディレクトリ、alias定義を変更時にコンフィグに書き出すようにしました
- もっとセキュリティ的につよく
	- 禁止コマンドを実行したときに、アラートとしてメンションを飛ばすようにしました

![1](https://user-images.githubusercontent.com/22161385/112720252-865f3f00-8f40-11eb-986a-58cd587776f1.png)

- アップロードに対応
	- **直前にslackにあげたファイルをサーバー側にアップロードできるようにしました**

![toSERVER](https://user-images.githubusercontent.com/22161385/112721553-c7a71d00-8f47-11eb-8982-161d89dfeb2a.png)

- ホスト選択のインタラクティブメッセージ化
	- アクセス先の切り替えを分かりやすく、インタラクティブ化しました

![2](https://user-images.githubusercontent.com/22161385/112720253-88290280-8f40-11eb-8974-d7cb8432a99a.png)
![3](https://user-images.githubusercontent.com/22161385/112720256-89f2c600-8f40-11eb-9a89-d7c0511e2bdd.png)

- ホスト定義の自動チェックモード追加
	- コンフィグ読み込み時にホスト定義がアクセス可能かどうかチェックするようにしました

### v0.5

マルチタスク実行に対応しました。処理した順に結果が返ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/7d76f1b9-0bba-5e09-55f8-a3d1309e7eff.png)

ファイルのSlackへのアップ、コードを動かしたサーバ上のファイルしかアップできてませんでしたが、リモートのサーバーからコピーしたうえでSlackにアップする処理に変えました！

### v0.6

設定をラベル化して各ユーザーに細かいロールを付けれるようにしました！

- アラートエスカレーション先のラベル化
- 使用許可するIDに使用不可コマンド、ファイルのダウンロード／アップロードの権限付与
- 使用禁止コマンドのラベル化
- アクセス可能ホストのラベル化

これにより、複数ユーザーで使う時にユーザー毎に細かいアクセス制限等がかけられます。
当たり前の機能ではありますが、ひとりで開発してるので要るとは最近思いつかなかったのよｗ

### v0.7

- 定義名をIDじゃなくてユーザー名にしても名前解決できるようにしました
    - IDで書いてあるとこれ誰用の定義だっけ？ってなってしまうのでユーザー名で書けるようにしました
- コマンドの先頭に#を付けることでscpしないで実行する高速実行モードをつけました
    - scpでコマンド送ってから実行するのを、実行だけやるので倍速になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/5f3bf662-b89f-b2ee-dd5b-af6613245315.png)

### v0.8

- 許可されたコマンドだけ実行できる制限モードを付けました
    - 禁止ワードを弾くと、反対の制限されたコマンドだけ実行できるモードでより細かくロールをつけれます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/1984e82d-8949-5df3-37ae-e8caf9730fa3.png)

- 各アカウントに利用期限を設定出来るようにしました
    - アカウントに有効期限の概念を入れました。これで未使用アカウントは自動的に無効化されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/0cefe7fe-6f63-1aa3-81ab-cf834d16d62a.png)

- 利用期限を定期的にレポートするようにしました
    - 特定のチャンネルにレポートを送信し、棚卸出来るようにしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/ed8a14bc-c890-3813-23de-7a210fca0d50.png)

- コンフィグを外から設定出来るようにADMINモードを付けました
    - 設定ファイルを書き換えなくても設定変更出来るようにしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/73f46e3e-f312-b931-8363-fd26410472ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/ce40df99-5d4c-ea3f-b978-ec446a86b940.png)

### v0.9

- レポートがID表示で分かり辛かったので、表示名を載せるようにしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/81d866f6-0241-0620-5f98-74972339da12.png)

- 実行したセッションが切れず残るバグを修正しました
    - SSHの実行後にセッション終了処理が入って無かった・・汎ミスです

- フルパス指定で実行していたコマンドを相対的に実行できるようにしました（ファイルのアップロードも併せて対応)
    - これまでファイル参照系コマンドはフルパスが基本でしたが、相対パスで実行できるようにしました。toSLACKコマンドもあわせて対応しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/2070d777-485a-8a54-12dc-60fcb21b5668.png)

### v0.991 - v0.993

- 相対パスに対応したよ
    - シェルみたいに相対パスでcdしたりが中途半端に出来なかったので対応しました
- メンション無しで動くようにしたよ
    - 毎回ボットにメンションするの面倒って話だったので無しでも動くようにしました

### v0.994

今回はバグフィックスリリースってかんじです。別のバグ作り込んでるかもしれないけどｗ

- プロンプトに今入っているホスト名(ホントはラベル名)が出るようにしました
    - ボット名前出ててたんですけど、ボットの名前なんか要らない情報ですよね・・ｗ
- 複数ルールがある時の挙動がバグってたので修正しました
    - 複数人で使う時に挙動がオカシイので直しました

### v1.0

だいぶ普段使いしててこなれてきたのでバージョンも1.0にしました！

- メンションが煩すぎるとかんじる人がいるようなのでお黙りモード(-nomention)を追加しました
    - 静かになります　※ただしセキュリティアラートはメンションでますよ
- セキュリティ的にヤバいバグがあったのでなおした
- 標準出力とエラー出力の文字数が多い方を出力として拾うように変更
    - diffコマンドとか差分がある場合にエラー出力に吐くコマンドの出力を拾えてなかったのでなおした

# 使い方

~~要するに踏み台の機能がBotになったと思っていただければ。全てBotヘメンションしてください~~

v0.993より　メンション不要になりました。
**ボットが動くローカルでコマンドが実行できるか検証して、エラーにならなければリモートでも実行できるものとして判定します
つまり動作させたいコマンドはローカルにも入っている必要があります**

- SETHOST=[コンフィグの定義名]でアクセス先を指定します

![sethost](https://user-images.githubusercontent.com/22161385/110207738-de1e0380-7ec8-11eb-96d7-f2fbb118cccd.png)

- ユーザーIDが許可されていれば、アクセス先が設定できます
- CLIのコマンドを入れると、ローカルにテンポラリのシェルが書かれます
- scpで転送し、転送先のサーバーでシェルが実行されます
    - ながったらしい出力はテキストファイルとしてアップロードされ、畳まれて表示されます。
	
![long](https://user-images.githubusercontent.com/22161385/110207746-ed04b600-7ec8-11eb-8f24-ce2302187f0a.png)

なお、cdコマンドに対応しているので**cdでディレクトリを移動したら保持**されます。

その他の使い方として toSERVER=(ファイル名)でサーバー上のファイルをアップできます。

![upload](https://user-images.githubusercontent.com/22161385/110207740-e4ac7b00-7ec8-11eb-8358-5133b984ec3d.png)

あとはリポジトリを見て頂ければ！

# あとがき
slackと連携するので、ちょっとモタツキがあってシェルプロンプト操作そのままのサクサク感は
無いんだけど、冒頭の「えっちらおっちら」が解消されるのはイメージできますよね？
リモワだから制約がかかる分、利便性も同時にあげるソリューションが必要なんじゃないかと思ってて
今回僕らしくそれをコードに出来たのかな、なんて思ってる。