速報 Packerでさまざまな仮想マシンのテンプレートを作成する

 2013/06/29
このエントリーをはてなブックマークに追加

続報で、VagrantのBoxの作り方について書きました。こちら

Vagrantの作者であるHashimotoさんが新たにPackerというツールをリリースした(昨晩!)ので速攻ご紹介。

このツールは、Amazon EC2のAMIやVirtualBoxやVMware用のOSのイメージを一貫性のあるインターフェイスで簡単に作ってくれるものです!たとえばVagrantの場合は以前はPatrickさんが作成したVeeweeを使うことが定番だったのですが、今後はそれに変わるものになってくるかもしれません。 (現時点はまだバージョン0.1なのでこれからどんどん良くなると思います!)

インストール

http://www.packer.io/downloads.html からビルド済みのファイルを入手します。もしくは自分でビルドすることも可能です(ビルドにはgoなどのツールが必要です)。 ファイルはzipで圧縮されているので解凍し、適当な場所にファイルをまるごと配置します。 配置したディレクトリをPATHに追加しておくと楽です。

はじめてのイメージ作成

イメージを作成するには作成内容を記載した設定ファイルを作成する必要があります。 今回は、サイトに例がのっているAmazon EC2のAMIを作る方法を試してみます。 Amazon EC2のAMIを作成する設定ファイルは以下のような感じでJSON形式で記述します。ファイル名は適当で構いません。 (アクセスキーやシークレットキーは自分のものに変えます)

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

これができたらpackerを起動します。

packer build first_template.json 

起動すると以下のように出力されます。

amazon-ebs output will be in this color.

==> amazon-ebs: Creating temporary keypair for this instance...
==> amazon-ebs: Creating temporary security group for this instance...
==> amazon-ebs: Authorizing SSH access on the temporary security group...
==> amazon-ebs: Launching a source AWS instance...
==> amazon-ebs: Waiting for instance to become ready...
==> amazon-ebs: Connecting to the instance via SSH...
==> amazon-ebs: Stopping the source instance...
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: first-ubuntu-1372454627
==> amazon-ebs: AMI: ami-298b1e28
==> amazon-ebs: Waiting for AMI to become ready...
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: Deleting temporary security group...
==> amazon-ebs: Deleting temporary keypair...
Build 'amazon-ebs' finished.

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:

us-east-1: ami-298b1e28

これでAMIのページを見るとAMIが作成されています。そしてAMIを作成するのに使ったAmazon EC2のインスタンスはちゃんとTerminateされています。 なお、上記の設定だと、元のAMIを使って自分用に新しいAMIを作っただけです。

自分用に設定を行ったイメージを作成する

さきほどのままだと大して有り難みがないように思えますが、自分でプロビジョニングの設定を書いて、それを適用したイメージを作ることが可能です。 JSONファイルに設定を追加します。また折角なので東京リージョンに変えつつ、AMI作成の時間短縮のために、インスタンスタイプを変えています。

{
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "YOUR ACCESS KEY",
    "secret_key": "YOUR SECRET KEY",
    "region": "ap-northeast-1",
    "source_ami": "ami-77cf4976",
    "instance_type": "m1.medium",
    "ssh_username": "ubuntu",
    "ami_name": "ubuntu-chef-{{.CreateTime}}"
  }],
  "provisioners": [{
    "type": "shell",
    "script": "script.sh"
  }]
}

設定ファイルにprovisionersの項目が追加されたことが分かると思います。 ここではshellでローカル側にあるscript.shを実行するようにしています。 script.shの内容は自分で好きに書いてください。今回はこんな感じで、単にパッケージを最新にしてChef Clientをインストールしています。

#!/bin/sh

sudo apt-get update -y
sudo apt-get upgrade -y

curl -L https://www.opscode.com/chef/install.sh | sudo bash

これで先ほどと同じように実行すれば、Chefクライアントがインストール済みの自分用のAMIができ上がります。うーん簡単!

その他

上記ではAmazon EC2のAMIを作成する例を説明しましたが、VirtualBoxやVMwareにも対応しています。 VirtualBoxなどの場合は、インストール時のキーボード操作をエミュレートする必要があるため、boot_commandの定義を追加してあげる必要があります。このあたりは近々紹介するつもりです(というか今のところハマってますww)。

 2013/06/29
このエントリーをはてなブックマークに追加