年中アイス

いろいろつらつら

saharaプラグインを使って、失敗しても戻せるようにする

2013/10/24 追記

ちょっと前に、vagrantのバージョンを上げてみたら、saharaが動かなくなったんですが、今は以下のコマンドで入りました。


vagrant plugin install sahara

MacOS Mervericks
VirtualBox 4.3
Vagrant 1.3.5
sahara 0.0.16

参考

OSXにvagrantとsaharaプラグインをインストール - Qiita
追記ここまで

      • -

vagrantを使った簡単仮想サーバ環境の準備 - 年中アイス
vagrantで複数の仮想サーバを作る - 年中アイス
に引き続いて、saharaプラグインの紹介です。

Vagrant1.1に、本家Saharaが対応しない(というよりアップデートが止まっている)ので、ryuzeeさんが、1.1でも動くものを公開されています。
正式にサポートしてる訳ではないので、使用は自己責任で。
Vagrantの必須プラグインSaharaをVagrant 1.1に対応させました | Ryuzee.com
ryuzee/sahara · GitHub
Vagrant1.1のMulti-VM環境でSaharaを使う方法 | Ryuzee.com

saharaとは

saharaは、仮想サーバの状態を記録し、あとでその時点にロールバックすることが出来るようにしてくれます。
いくらvagrantで、サーバを作ったり壊したりできるといっても、新しく仮想サーバを作って、検証できる状態に持って行くのには手間がかかります。壊れるかもしれない変更を加えるのは、ためらいます。
そこで、saharaを使ってある時点のサーバの状態を記録しておき、いつでも戻して再挑戦できるようにします。

導入手順

gemとしては公開されていないので、こちらにあるように自分でビルドしてインストールします。

git clone https://github.com/ryuzee/sahara.git
cd sahara
bundle install
bundle exec rake build
vagrant plugin install pkg/sahara-0.0.14.gem

対象仮想サーバのVagrantfileのあるディレクトリで、まずはsandboxモードを有効にします。

# ホスト側(以降vagrantコマンドはすべてホスト側)
vagrant sandbox on

仮想サーバに繋いでファイルを作ります。実際はここで任意の検証を行います。

vagrant ssh

# 仮想サーバ側
echo "I will be erased." > update
ls
# update

ロールバックします。

vagrant sandbox rollback

ファイルが消えている(変更が取り消されている)ことが確認できます。

vagrant ssh

# 仮想サーバ側
ls
# updateファイルがなくなっている

変更を加えた状態で、もう戻す必要がなくなったら、コミットします。これを忘れると、次にロールバックした時や、sandboxモードをoffにしたときに元に戻ってしまい、泣くことになります。
逆に、間違えてcommitしても泣きます。

vagrant sandbox commit

検証作業が終わったら、sandboxをoffにします。(必要ならcommitを忘れずに)
最後にvagrant sandbox commitした時点か、一度もcommitしていなければ、onにした時点に戻ります。

vagrant sandbox off

所感

私は、Redmineのサーバ移行に伴って、バージョンを上げるときに、データをそのまま移行できるかどうかを確認するのに使いました。
新しいバージョンのRedmineを構築して、sandboxをonにして、データベースのリストアなどを、ロールバックしながら試しました。うまく行った後に、一度ロールバックして、再度回り道無しの手順を試して確認してから、実際の本番機での移行を行いました。

失敗した時はもちろんですが、成功した時も、戻して再度手順の確認を行えるのが良いです。単に再度手順を行うだけだと、サーバの状態が変わっていて、漏れがでるなどの問題が発生しがちです。saharaでロールバックすれば、元の状態に戻るので、そのリスクが減らせます。

あとは、変更自体もchefやcapistrano,fabricなどのツールを使えば、検証後の実施も失敗のリスクが減りますね。