しゃかまる

2014.06.30

Vagrantイメージを自作した話 Packer編

こんにちは、村上です。

少し前のことですが、弊社も新卒のエンジニア向けに新人研修を行いました。
私の担当はLinuxの基礎や環境構築の話だったのですが、あまり使ったことがなく調度良い機会だったのでVagrantを使うことにしました。

http://www.vagrantbox.es/ からイメージを落としてきても良かったんですが、せっかくだったので、Vagrantイメージを作ったことが無かったし自作することにしました。
最近Dockerが話題になっていることもあり、Packerを使うことにしました。

前置きはそんなところで先に結果を書きますが、実際にPackerを使って作ることはできませんでしたorz
今回はその時の作業内容です。

Packer

packerは単一の設定ファイルからマルチプラットフォーム向けに仮想マシンイメージを作ってくれるツールです。
オフィシャルサイトからダウンロードして使うか、Macの場合はbrewでも配布されています。

仮想マシンも様々なタイプに対応していて

  • AWS (EC2)
  • Docker
  • Google Comute Engine
  • Virtualbox
  • VMware

や、その他主流なプラットフォームに対応しているようです。
今回はVirtualBoxを利用することにしました。

仮想マシン作成時に自動的に環境を作ってくれるコマンドである、Provisionerもいろいろなものをサポートしています。

  • ShellScript
  • Chef Client
  • Chef Solo
  • Puppet Masterless
  • Pupper Server

などなど、流行りのChefもサポートされていますね。

Packerを使う際の大まかな流れは以下のようになるようです。

  1. 1. Packerをインストールする
  2. 2. 作成する仮想マシンイメージの設定ファイルを作成する
  3. 3. Provisionerを用意する
  4. 4. buildする

特にProvisionerを用意することはしなかったので、設定ファイルの作成とbuildについて書きます。

設定ファイルはjsonで記述します。
template.jsonという名前にすると、packerが自動的に読み込んでくれますので、仮想マシンを作成するディレクトリにtemplate.jsonを作ります。
templateの中身は {{ }} でくくることで変数化することができます。
例えば、{{ .Name }} とすると Nameの値が展開されます。
これはgolangのtemplateの構文そのままですね。内部でparseしてくれてるんでしょう。

templateファイルのテンプレートは以下のページから見ることができます。
http://www.packer.io/docs/templates/introduction.html

今回は既存のVirtualBoxのイメージを使いたかったので、以下のページを参考にしてbuildersの内容を作りました。
http://www.packer.io/docs/builders/virtualbox-ovf.html

なお、virtualboxの仮想マシンデータは.vbox形式です。これはPackerでは取り扱えないので、ovf形式でエクスポートしましょう。
VirtualBoxの出力したい仮想マシンを選択し、

[ファイル] > [仮想アプライアンスのエクスポート]

でovf形式でエクスポートすることができます。

設定ファイルを作成したら
packer validate を実行して内容に問題ないか確認します。

エラーがあると以下のようなエラー分が表示されます。

Template validation failed. Errors are shown below.
Errors validating build ‘virtualbox-ovf’. 1 error(s) occurred:
source_path is invalid: stat /path/to/hoge.ovf: no such file or directory

ファイルが見つからないようですね。
修正して再度validateすると

Template validated successfully.

エラーがなくなりました。
最低限ですがこれで一旦設定ファイルができましたので、仮想マシンを作ってみましょう

これでうまく行けば仮想マシンが作られます。
エラーが起きて止まってしまったら、buildコマンドに-debugオプションをつけて内容を確認しましょう。

さて、私の環境では一時的に仮想マシンは作られますがSSHコネクションが張れないということで落ちてしまいます。
debug実行すると仮想マシンを一時的に起動した状態で止められるので、その状態でサーバにログインして見てみると、ネットワークの設定が空になっていました。

おそらく、template.json内にVBoxManageを設定しないといけないようですね。
内容は http://www.virtualbox.org/manual/ch08.html を参考にすればいいのでしょうが、ちょっと心が折れましたのでまたの機会にしようと思います・・

というわけでpackerに負けてしまいましたが、そのうちリベンジをしたらその時の内容をアップしたいと思います。
じゃあ実際にどうしたの?というところを次の記事で書こうと思います。

参考までに、この時点でのtemplateファイルの内容を貼っておきます。