こんにちはCTOの馬場です。
ハートビーツではPythonとGolangを推奨プログラミング言語としています。 インフラがメインの会社っぽいでしょう?
社内チャットツールとしてSlackを使っているので、 chatbotを作って便利に使っています。 今回はGolangで自作したリソースロックのためのchatbotである 「locket」を紹介します。
lock-it => locket という感じの命名です。
いまのところOSSにしていませんが、 弊社のお客さまであればバイナリは提供できると思うのでご相談ください。
locketでできること
システム運用上、作業Aと作業Bを並走させてはいけない、というシーンはよくありますよね。BINDの設定変更とか。 どちらもソフトウェアで完結できる処理であればキューイングして自動処理できますが、片方が手作業の場合はそうもいきません。なんだかんだで声掛けして運用で競合回避したりしがちです。
そういうことを気にしないで済むように全てシステムで組めるのが望ましいのはもちろんなのですが、現実はそうそううまくいかない悩ましさをなんとか楽にするbotです。
- lock, unlock, 強制unlock
- lock/unlock履歴表示
- 検索
- 削除(検索から非表示にする)
- リマインド(lock取得後60分以上経過したら、30分おきに mention つけて問いかけ)
こんな感じでbotにお話すると...
baba [12:44 PM] @bot lock deploy
結果をお返事してくれます。
bot APP [12:44 PM] @baba OK: lock deploy succeed
CLIやHTTP APIも備えているのでプログラムとの連携が可能です。
BINDだけでなく、たとえばチケット番号(もしくはチケットツールのURL)をロックすることで作業の競合回避に使えたりします。 それぞれ個別のシステムで競合回避の仕組みは実装できますが、 個別に実装しなくてよい、集約できる、というのがツールを切り出す利点です。
検索は正規表現が使えるので、
リソース名を redmine::#12345
のようにprefix/suffixを使った命名規則にしておくと、
search ^redmine::
などのように簡単に一覧できます。
Golang的な話
実装したタイミングの経緯から、go 1.7.1で実装しています。
以下のライブラリを使っています。 portabilityの練習のためにPure Golangにしてみたかったので boltdb を使っているところが珍しいかもしれません。 boltdb が機能として適切だったかというとそういうわけではなく、 力技で全サーチするような厳しい実装になっているところがあります。
- CLI: github.com/urfave/cli
- DBMS: github.com/boltdb/bolt
- Slack: github.com/nlopes/slack
- WAF: github.com/go-martini/martini
- ログ: github.com/Sirupsen/logrus
なおVendoringにはglideを利用し、GitLab CIでビルドしています。 GitLab CIはすばらしいですね。 ちなみにbotの稼働環境は社のDockerサーバです。
Why Golang?
特に深い理由はありません。
以前HipChatを利用していた頃は Python で Will を使って実装していました。
skoczen/will: Will is a simple, beautiful-to-code bot for hipchat, and soon a whole lot more.
利用ツールがSlackに変更になったのを機に、もう片方の推奨プログラミング言語であるGolangで実装してみようと思い立ったというくらいの感じです。 どちらも推奨プログラミング言語だし、このくらいの軽い感じでさくさく変えてもよいと思っています。
一緒にやってみませんか?
こんな感じで、いろんな身近な困りことをソフトウェアで解決する仕事をしています。 まだまだやることがたくさんあるので、一緒にやってくれる方を募集しています!
CTO直轄チームでDevOpsを支えるプログラマーをWanted!! - Web エンジニア中途・新卒の求人 - Wantedly