Packerリリースおめでとうございます!

先週末に Vagrant で有名な @mitchellh さんの新作、”Packer”が発表されました(正式にいつリリースしたのかよく分かってないですが、HN に流れたのは先週)。

簡単に言えば、EC2 や Virtualbox などの仮想環境における OS インストール作業を、設定ファイル 1 枚で自動化できるツールです。似たようなツールはたくさんありますし、これからもたくさん出てくるでしょう。ぜひいろんな人に今のうちから触ってもらって、よりよいツールにしていって欲しいと思ったので、超簡単な紹介をしておきます。英語が苦じゃない人は Intro をひと通り読むと良いと思います。

Packer 概要

Packer はメタ OS インストール自動化ツールで、いくつかのフェーズを持ちそれぞれのフェーズで plugin を組み合わせることで OS のインストール方法を記述し自動で行うソフトウェアになります。plugin は複数利用できるので一枚のファイルから Virtualbox と EC2 のサーバを作ることも可能で、手元の開発環境の Virtualbox と本番環境の EC2 でほぼ同じサーバを使うということが、職人芸が無くてもできるようになります。

  • Builder

    • OS のインストール
    • 元になる instance 起動
  • Provisoner

    • インストール後の設定、ソフトウェアインストール
  • Post-Processer

    • 終了後の後処理

OS インストール自動化といえば、kickstart や preseed が思い浮かびますが、virtualbox の Builder プラグインでは結局 kickstart や preseed を使うことになります。たただ、preseed.cfg を HTTP サーバ立てて読ませるとかを自動で管理してくれて大変楽です。preseed で late_command とかで頑張ってやっていた後処理は、Provisioner に記述できます。ここでは shell スクリプト実行させることが多いとおもいますが、それをサーバに送って実行するとかも管理してくれます。最後に Post-Processor で、作り終わったサーバの Artifact(イメージ相当のもの)をどこかにアップロードしたり、Vagrant の box に固めたりとかもできます。ちなみに EC2 の Builder はこれをしなくても勝手に snapshot 作ってくれるみたいです。

似たようなソフトとして、Vagrant の box 作る veewee とかがありますが、それをもうちょっと汎用化した感じになります。ちなみに veewee の設定を Packer 様に変換する veewee-to-packer というのもあります。ちょっとバギーですが、たたき台にするには十分過ぎると思います。

Go

Packer の記述言語は Go です。Go を使うメリットは、僕が思うに、各種プラットフォーム向けのコンパイルおよび配布が簡単(依存ライブラリ無いので)と、goroutine を使うと待ち時間の多いインストール処理の並行処理が簡単にできそう、といった辺りでしょうか。使うだけであれば単に自分のアーキテクチャのバイナリをダウンロードして展開するだけで使えてとてもシンプルです(Go のインストールは不要)。個人的には Go で書かれるこうした管理系のツール増えてくるんじゃないかなと思ってるので、Go を勉強しはじめるいいタイミングですね。

EC2 Builder を試してみる

手始めには EC2 Builder を試すのが速くて楽です。

{
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "YOUR KEY HERE",
    "secret_key": "YOUR SECRET KEY HERE",
    "region": "us-east-1",
    "source_ami": "ami-de0d9eb7",
    "instance_type": "t1.micro",
    "ssh_username": "ubuntu",
    "ami_name": "packer-example {{.CreateTime}}"
  }]
}

これを適当なファイルに保存して、

packer build test.json

とするだけで、指定した AMI を起動して、今回は何も処理をせず”packer-example 1372465319″みたいな名前で新しい AMI を保存してくれます。この設定ではインストール時に一時的に key pair と security group 作ってくれるので何も気にしなくていいです。終わったら消してくれます。雰囲気がわかれば、後は Provisioner に好きな処理を挟み込んであげればいくらでもカスタマイズした AMI を焼きこむことができます。簡単。

皆さんきっと手元でなんか適当なスクリプトとかを使って、この焼き込みをやっているんだと思いますが、Packer を使えば分かりやすいフォーマットにまとめなおすことができるはずなのでぜひこの機会に使ってみるといいのではないでしょうか。

Virtualbox Builder と Vagrant Post-Processor を試してみる

次に、Vagrant 用の box を作るという想定で、Virtualbox をインストールして、Vagrant box に固めてみます。とりあえずは veewee の設定ファイルを使うのが楽なので、veewee-to-packer を入れて実行。ちょっとバグってた部分とかあったので直したりしたのがこちら。

これでコマンド実行すると勝手に ISO ダウンロードして、Virtualbox 起動して、preseed 用の HTTP サーバ起動して、起動コマンド打ち込んで preseed 走らせて、再起動後に ssh して Provisioner 実行して、終わったら Vagrant の box に固めるところまでが全自動で走ります。もちろんちょっと時間かかりますが。。。

Vagrant との組み合わせ

僕が最初に Packer 見た時の感想は、Vagrant の”missing link”でした。Vagrant はとても便利なんですが、どうしても box の状態がバラバラなので、ちゃんとした環境管理には使いにくかったです。それが、Packer によって複数環境に対してある程度揃えた box が準備できるとなれば、すごいきれいな管理ができると思います(やってないので推測ですが)。veewee は確かにあったのですが、vagrant 専用だったので本番環境で使いづらそうで結局ほとんど使ってませんでしたが、Packer はそういうのも視野にいれていて、すごく柔軟性の高いツールに仕上がっているのでオススメです。

個人的な感想

mitchellh さんのツール群すごい良いです。なぜ Packer と Vagrant が良いと僕が思うかというと、OS Install と Provision というサーバ構築のフェーズのうちの 2 つをキレイに分離して、かつ複数環境をサポートしている plugin 機構を持っているからです。これについて書くと長くなるのでやめておきますが、端的に言うなら美しいと僕は思います。次の作品は、Orchestration の管理ツールなのかなぁ、と期待してしまいます。

まだまだバグも多くて、すぐに production で使えるかというとわかりませんが、手元の汚い環境を勘と経験と口伝と history で管理し続けるくらいなら、試してみる価値はあると思います。すでにそういうツールを自前で持っている人も、Packer のエコシステムに乗せられれば他の人の貢献からの恩恵を受けることができたり、逆にエコシステムに貢献できたりすると思うのでぜひ検討してみて下さい。

個人的にはこれからウォッチしていきたいソフトの一つです。あぁ、いつかこういうツールが作れる人になれたらいいなぁ。