Allied ArchitectsAllied ArchitectsEngineer Blog

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

2014/06/30 インフラ

こんにちは、村上です。

少し前のことですが、弊社も新卒のエンジニア向けに新人研修を行いました。
私の担当は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ファイルの内容を貼っておきます。

しゃかまる
  • しゃかまる
  • エンジニア
  • フロントエンドだったりバックエンドだったりサーバだったり その時の流行りと気分でいろいろ迷走してます。

RELATION ENTRY

JSでページ遷移しないフォームを作る(Advent Calendar 24日目(仮))

JSでページ遷移しないフォームを作る(A...

2014/12/25 2014 Advent Calendar

こんにちは、Advent Calendar 24日目(仮)を担当する村上です。 昨日の紹介と違う理由は推して知るべしです。 前回と前々回がゆるふわ記事だったのでマジメな記事です。 今回は素のJSでページ遷移しないフォームを作った話を書こうと思います。 目的 ページ遷移しないフォームを作ることが...

続きを読む

シェル芸人への道 その1 (Advent Calendar 16日目)

シェル芸人への道 その1 (Advent...

2014/12/16 Shell

こんにちは、しゃかまるです。 Advent Calendarも16日目です。進捗どうですか?私はダメです。 今回もゆるふわな記事です。 概要 シェル芸ってご存知ですか? こんな感じのことをされている方々です。 私もCUIが好きでgitの操作は全てターミナルでやったりしてるタイプですが、シェル芸人...

続きを読む

しゃかまるの記事一覧へ

ページTOPへ