6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoでGracefulにShellスクリプト実行できるツールを作った

Posted at

これなんだ

インフラやるならGo書けると色々嬉しいことあるよと聞くので挑戦してみました。
今回作った理由は、AWSでサーバ台数減らす時にAutoScalingだと、いきなりシャットダウンされるので
td-agentとかに残ってるバッファが飛んでしまうのを対応したかったため作りました。

ツール名は exodia です
https://github.com/a4t/exodia

何故Goなのか?

Rubyとかでこういったツールを書いてたこともあるのですが、Rubyのバージョンであったりgemのバージョンとかで動かなくなることがあります。
その辺りの管理が全く必要なく、バイナリ一つで動くGoは非常に使いやすいです。

exodiaの使い方

yamlもそれほど項目ないのと、先ほどの説明とサンプルのyaml見れば大体どんなことができるかわかると思います。

wait: 30      # check の項目に移動するまでの待機時間
interval: 5   # check で失敗した場合のリトライまでの待機
checkretry: 5 # check で失敗した場合のリトライ回数
scripts:
  pre:
    - service nginx stop
    - service td-agent stop
  check:
    - ps aux | grep [t]d-agent && exit 1 || exit 0
    - ps aux | grep [n]ginx && exit 1 || exit 0
  post:
    - shutdown -h now

pre で 事前に何か実行して
checkpre で実行したことが失敗することなく実行されているか確認し
post で本当にやりたかったことを実行する

といった感じになっています。

使い道

結構色々な用途に使えるようになっているかと思っています。
よくあるパターンはプロセスをチェックして、ちゃんと終了してからpostを実行するというパターンだと思います。

今回はサーバの停止なので実際のフローは以下のような形になると思います。

何らかの方法でサーバの台数を減らすという状態を取得
↓
何らかの方法で停止するサーバへ通知
↓
exodiaを実行

最後に

webhook受け付けるようにしたらもっと便利になったりするんだろうかと思いつつも、機能をシンプルにしたいという思いがあり付けてません。
Goの作法全然把握してないのでプルリクお待ちしてます!

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?