vagrant upからのレシピの実行が1時間17分もかかるようになってしまった

Chefレシピがだいぶすらすら書けるようになってきた@DQNEOですこんにちは。

開発用の仮想マシンを構築しようと思ってVagrant + Chefでレシピを一生懸命作っていたら、 いろいろ盛り込みすぎてレシピの実行に1時間17分もかかるようになってしまいました。
ぐぬぬ。

何をやりたかったのか?

このchef-repoをVagrant + VirutalBoxで構築したかったのです。
https://github.com/DQNEO/mykitchen

具体的には、
  • Aache + PHP5.5
  • plenv + Perl5.18
  • CPANモジュールいくつか
  • zsh
  • Git
  • Emacs
  • ImageMagick
などのインストールです。
PHP5.5とApacheはyumで、他はソースコードからコンパイルして入れています。
コンパイルに一番時間がかかってるようです。

Vagrantfileのレシピ指定はこんな感じ。
    chef.add_recipe "timezone"
    chef.add_recipe "yumfastestmirror"
    chef.add_recipe "git"
    chef.add_recipe "emacs"
    chef.add_recipe "zsh"
    chef.add_recipe "base::chsh"
    chef.add_recipe "httpd"
    chef.add_recipe "remi"
    chef.add_recipe "base::disableservices"
    chef.add_recipe "base::packages"
    chef.add_recipe "base::php55"
    chef.add_recipe "base::sshkey"
    chef.add_recipe "base::dotfiles"
    chef.add_recipe "base::hellohtml"
    chef.add_recipe "base::hellophp"
    chef.add_recipe "plenv"
    chef.add_recipe "plenv::cpanmodules"
    chef.add_recipe "imagemagick"
さすがに1時間超えるようだと、Vagrant up してから風呂に入って出てきてもまだ終わっておらず、
さらに牛乳を一杯あっためてゆっくり飲んでPCの前に戻ってきてもまだ終わってない感じです。

レシピの記述を一か所でもミスるとエラーでこけてしまうので、風呂あがりにエラー画面を見たときの絶望感といったら。

どうするべきなのか?

対策案を考えてみました。
  • 速いPCに買い替える
  • 無線LANではなく有線LANでつなぐ
  • 自分のPCではなくAWSやDigitalOceanなどのクラウドを使う
  • 毎回ソースからコンパイルするのではなく、rpmパッケージ化してそれを再利用する
  • ある程度ビルドした状態の仮想マシンのスナップショットをとってそれを使う

速いPCに買い替える

今使っているPCが2010年夏に買ったWindows7なので、マシン性能が影響している可能性は大いにあります。
最新のMacBookProとかに買い替えればもうちょっと速くなるかもしれません。

無線LANではなく有線LANでつなぐ

rpmやtar.gzファイルのダウンロード時間短縮に効果があるかもしれません。
実験してみる価値はありそうです。

自分のPCではなくAWSやDigitalOceanなどのクラウドを使う

これもやってみる価値はありそうです。

rpmパッケージを作る

Perl,Git,zsh,Emacsなどはコンパイルオプションをそうそう変えるものではないので、rpm化すればサーバ構築時のコンパイル時間を省略できそうです。

昔のはてなのサーバ構築の話しで
「なんでもrpmパッケージ化 & yum で一発インストール」と最近、話題に登っていた「設定自動化ツールpuppet」を導入することで、ほぼ自動化されるようになり、大幅な時間短縮ができるようになりました。」

まっさらなサーバを30分で本番投入できるようにする - stanaka's blog
とあるので割と王道かもしれません。

難点は、rpmbuildをやったことがないのでちょっと敷居が高いことです。
でも逆にrpmbuildをマスターすればサーバ構築のスキルが一気に上がるので、よいきっかになるのかもしれません。

ビルド済みの仮想マシンをスナップショットして再利用

zsh,emacs,gitあたりは必ず使うので、ビルド済みの仮想マシンのスナップショットを取っておいて、 そのスナップショットに対してPerlやPHPなどのアプリケーションレイヤを追加インストールする、みたいな手法が考えられます。

ただ、これをやってしまうと状態を持ったスナップショットマシンを管理することになってしまいます。
つまり、スナップショットとレシピが一致しているのかを常に意識しなくてはいけなくなります。
「このスナップショットはどのレシピから作ったのか?」
「このレシピを適用すると必ずあのスナップショットを再現できるのか?」
等。
これはImmutable Infrastructureの流れに反するのではないかともやもやしています。
(そうも言ってられないのですが)

ご意見募集しています

こうすればいいよ、等のアドバイスをいただければ幸いです。
Twitter、はてぶでご意見をお待ちしております。
カテゴリ: