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のエコシステムに乗せられれば他の人の貢献からの恩恵を受けることができたり、逆にエコシステムに貢献できたりすると思うのでぜひ検討してみて下さい。

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