OpenStackにはlive-migrationと言う機能がある。 この機能を使うと、インスタンスが稼働中のまま他の母艦に移動することができる。 ハードウェア障害やカーネルアップデートなどで、母艦のシャットダウンが必要になった場合に、稼働中のインスタンスを問題のない別の母艦に移動するのによく使っている。
live-migrationはopenstack-cliやWebUI(Horizon)などから実施することができるのだが、1つ問題がある。 それは live-migrationが終わったことに気がつくことができない*1 いつlive-migrationが終わるのかを意識しつづけなければならないのはつらい…。 そこで、live-migrationの実行・終了を監視、Slackに状態を通知するスクリプトを作成した。
使い方
今のところ環境変数で設定を渡すようになっているので*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
通知される内容は以下のような感じ。
仕組み
conductorから各agentへの通知はRabbitMQを使って*3通知される。 live-migration-notifierは、RabbitMQに流れるキューを監視して、live-migrationに関わるキューが来た場合に通知処理を行う。
最初、conductorやagentに手を入れて実装しようとしたが、バージョンアップによりコードが変わるとそれに追随してソースを変更しないといけなくなりつらくなるので今のような実装にした。
おわりに
live-migration-notifierを作ったおかげで、live-migrationの状態が可視化されてとても便利になった。
また、導入以前にlive-migrationがエラーに終わったことも通知されず、毎度 nova migration-list
してステータスを取らないとわからない状態でストレスになっていたが、それもわかるようになってとてもストレスフルだ!
利用者の方々からもとても便利になった!!!最高!!!!抱いて!!!!っと好評です(当方調べ)。
とりあえず動く!を目指して作ってしまったため、コードがかなり雑なのでこれを何とかしたい…というのが直近の目標。 リファクタしたらrubygemsにパブリッシュする予定です。