それ何?
Packerは1つのコンフィグファイルから複数のプラットフォーム上に常に同一のマシンイメージを作るためのツールです。
複数のプラットフォームって何のこと?
Packerがマシンイメージを作成できるプラットフォームは以下の通りです。
- Amazon EC2
- CloudStack
- DigitalOcean
- Docker
- Google Compute Engine
- OpenStack
- Parallels
- EQMU
- VirtualBox
- VMWare
何ができるの?
指定のプラットフォーム上に既存のツールを使って プロビジョニング済みの マシンイメージを作ることができます。
既存のツールって何?
- Ansible
- Cheff
- Puppet
などです。
やってみよう
お試しで、inline shellで適当にプロビジョニングしたAMIを作ってみます。
テンプレートを作る
Packerでいいことをするには、プラットフォームの設定とプロビジョニングの設定を含むテンプレートファイルを作る必要があります。
{
"builders": [
{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "us-east-1",
"source_ami": "ami-b73b63a0",
"instance_type": "t2.micro",
"ssh_username": "ec2-user",
"ami_name": "ami-b73b63a0 base packed ami {{timestamp}}"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"sudo yum -y update",
"sudo yum -y install nginx",
"echo 'hello world.' > ~/packer.txt"
]
}
]
}
packerで実行する
前述のjsonファイルを packer で実行してみます。
packer build sample.json
しばらくまっていると作成に成功したようです。
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-821a1695
EC2のインスタンスを確認すると、AMI作成に使ったインスタンスは行儀良く削除(terminate)されていました。
更にAMIの中を確認したら、ありました。
hello worldのファイルも確認できました。
最後に
実務で使う場合はansibleでprovisioningしてcapistranoでアプリケーションをdeployした後イメージ化したいですね。
確認してないですが、多分できるんだろう。出来るといいな。