ぶていのログでぶログ

思い出したが吉日

OpenStackのlive-migrationをSlackに通知するくんを作った

OpenStackにはlive-migrationと言う機能がある。 この機能を使うと、インスタンスが稼働中のまま他の母艦に移動することができる。 ハードウェア障害やカーネルアップデートなどで、母艦のシャットダウンが必要になった場合に、稼働中のインスタンスを問題のない別の母艦に移動するのによく使っている。

live-migrationはopenstack-cliやWebUI(Horizon)などから実施することができるのだが、1つ問題がある。 それは live-migrationが終わったことに気がつくことができない*1 いつlive-migrationが終わるのかを意識しつづけなければならないのはつらい…。 そこで、live-migrationの実行・終了を監視、Slackに状態を通知するスクリプトを作成した。

github.com

使い方

今のところ環境変数で設定を渡すようになっているので*2、RabbitMQやSlackのWebHook URLを環境変数にセットする。

$ export RABBITMQ_HOST=<rabbitmq host>
$ export RABBITMQ_PORT=<rabbitmq port>
$ export RABBITMQ_USER=<rabbitmq user>
$ export RABBITMQ_PASSWORD=<rabbitmq password>
$ export SLACK_WEBHOOK_URL=<webhook url>

環境変数にセットしたら、あとは notifier.rb を実行すれば動くはず。

$ bundle install
$ bundle exec ./notifier.rb

通知される内容は以下のような感じ。

f:id:buty4649:20180530145019p:plain

仕組み

f:id:buty4649:20180530142904p:plain

conductorから各agentへの通知はRabbitMQを使って*3通知される。 live-migration-notifierは、RabbitMQに流れるキューを監視して、live-migrationに関わるキューが来た場合に通知処理を行う。

最初、conductorやagentに手を入れて実装しようとしたが、バージョンアップによりコードが変わるとそれに追随してソースを変更しないといけなくなりつらくなるので今のような実装にした。

おわりに

live-migration-notifierを作ったおかげで、live-migrationの状態が可視化されてとても便利になった。 また、導入以前にlive-migrationがエラーに終わったことも通知されず、毎度 nova migration-list してステータスを取らないとわからない状態でストレスになっていたが、それもわかるようになってとてもストレスフルだ! 利用者の方々からもとても便利になった!!!最高!!!!抱いて!!!!っと好評です(当方調べ)。

とりあえず動く!を目指して作ってしまったため、コードがかなり雑なのでこれを何とかしたい…というのが直近の目標。 リファクタしたらrubygemsにパブリッシュする予定です。

*1:openstack-cliなら、 --wait オプションを付けることで、live-migrationが終了するまでコマンドを待機させることができるので、それを終了をトリガーに通知するような仕組みを作ればできなくはないが、利用者に環境をそろえてもらうのが大変

*2:雑に作ってしまったので、そのうちちゃんとconfigファイルから設定を読み込むように変更したい

*3:ZeroMQやQpidなども選べるが弊社環境ではRabbitMQを使っているし、live-migration-notifierの実装はまだRabbitMQにしか対応していない