少し前に Consul を学ぶために活用した「HashiCorp Learn Platform」の学習コンテンツに最近「Vagrant / Packer」も追加されていた.今年3月末時点では「Vault / Consul / Terraform / Nomad」の4種類だったため,現在は6種類になっている.Packer は AMI (Amazon Machine Image) を作るときに使うこともあり,基本的な機能は理解しているけど,学習コンテンツに興味があり受講してみた.Consul の学習コンテンツとは異なり,Packer の学習コンテンツに動画はなく,ドキュメントベースになっていた.
Learn to build automated machine images with Packer : Getting Started
現時点だと「Learn to build automated machine images with Packer」の「Getting Started」が公開されている.全6ステップから構成されていて,累計「46 min」と,コンパクトにまとまっている.内容的には Packer で AMI を作ったり,DigitalOcean と Vagrant のイメージを作ったりする.Packer 未経験者に最適な学習コンテンツだと思う.
- Install Packer (5 min)
- Build an Image (20 min)
- Provision (5 min)
- Parallel Builds (10 min)
- Vagrant Boxes (4 min)
- Next Steps (2 min)
learn.hashicorp.com
Install Packer
「Install Packer」ステップでは,Packer をインストールする.今回は Mac で動かすため,brew を使うことにした.
$ brew install packer
$ packer --version
1.4.1
OS ごとにバイナリも公開されている.
www.packer.io
Build an Image
「Build an Image」ステップでは,さっそく AMI を作るため,以下の example.json
を用意する.今回は aws_access_key
と aws_secret_key
はテンプレートに含めず ~/.aws/credentials
を参照するようにした.
{
"builders": [
{
"type": "amazon-ebs",
"region": "us-east-1",
"source_ami_filter": {
"filters": {
"virtualization-type": "hvm",
"name": "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*",
"root-device-type": "ebs"
},
"owners": ["099720109477"],
"most_recent": true
},
"instance_type": "t2.micro",
"ssh_username": "ubuntu",
"ami_name": "packer-example {{timestamp}}"
}
]
}
次に packer validate
でテンプレートを検証し,packer build
でビルドをすると,すぐに AMI を作れる.
$ packer validate example.json
Template validated successfully.
$ packer build example.json
amazon-ebs output will be in this color.
(中略)
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-xxxxxxxxxxxxxxx
詳細は以下の公式ドキュメントに載っている.
packer.io
次に「File Provisioner」と「Shell Provisioner」を組み合わせてプロビジョニングを試す.
まず,以下の firstrun.json
を用意する.テンプレートに provisioners
を追加することにより,welcome.txt
を作成したり,example.sh
を実行したりしている.builders
の部分は既に用意した example.json
とほぼ同じ設定になっている.
{
"builders": [
(中略)
],
"provisioners": [
{
"type": "file",
"source": "./welcome.txt",
"destination": "/home/ubuntu/"
},
{
"type": "shell",
"inline": ["ls -al /home/ubuntu", "cat /home/ubuntu/welcome.txt"]
},
{
"type": "shell",
"script": "./example.sh"
}
]
}
同様に packer validate
と packer build
で AMI を作ると,以下のように provisioners
の処理が進んでいる.
$ packer validate firstrun.json
Template validated successfully.
$ packer build firstrun.json
amazon-ebs output will be in this color.
(中略)
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Uploading ./welcome.txt => /home/ubuntu/
welcome.txt 19 B / 19 B [=======================================================================================================================================================================================================] 100.00% 1s
(中略)
==> amazon-ebs: Provisioning with shell script: ./example.sh
amazon-ebs: hello
(中略)
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-xxxxxxxxxxxxxxx
最後は Windows AMI を作る内容になっているけど,今回は実施しなかった.
他にも AMI を指定するときに source_ami
ではなく source_ami_filter
を使う理由だったり,provisioners
ではなく user_data_file
を使うこともできたり,実際に Packer を使うときに知っておくべき内容も記載されていて良かった.
packer.io
packer.io
Provision
「Provision」ステップでは,「Shell Provisioner」を使って Redis をインストールする.今回は example.json
に以下の provisioners
を追加する.意図的に sleep
を追加している理由は「正常に OS が初期化されるまで待つ」と書いてあった.
{
"builders": [
(中略)
],
"provisioners": [
{
"type": "shell",
"inline": [
"sleep 30",
"sudo apt-get update",
"sudo apt-get install -y redis-server"
]
}
]
}
同様に packer validate
と packer build
で AMI を作る.
$ packer validate example.json
Template validated successfully.
$ packer build example.json
amazon-ebs output will be in this color.
(中略)
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-xxxxxxxxxxxxxxx
実際に AMI から Amazon EC2 を起動すると,Redis がインストールされていた.
$ dpkg -l | grep -i redis
ii redis-server 2:3.0.6-1ubuntu0.3 amd64 Persistent key-value database with network interface
ii redis-tools 2:3.0.6-1ubuntu0.3 amd64 Persistent key-value database with network interface (client)
Parallel Builds
「Parallel Builds」ステップでは,「AMI Builder」と「DigitalOcean Builder」を使って,マルチプラットフォームを実現する.DigitalOcean のアカウントを持ってなく,今回は実施しなかったけど,以下のように builders
に複数の type
を並べると自動的にビルドされる.
{
"builders": [
{
"type": "amazon-ebs",
"region": "us-east-1",
"source_ami": "ami-fce3c696",
"instance_type": "t2.micro",
"ssh_username": "ubuntu",
"ami_name": "packer-example {{timestamp}}"
},
{
"type": "digitalocean",
"api_token": "{{user `do_api_token`}}",
"image": "ubuntu-14-04-x64",
"region": "nyc3",
"size": "512mb",
"ssh_username": "root"
}
],
"provisioners": [
(中略)
]
}
Packer の良さは Builder に指定できる種類の多さにあり,「DigitalOcean Builder」以外に「Docker Builder」などもある.
packer.io
packer.io
Vagrant Boxes
「Vagrant Boxes」ステップでは,Post-Processors の機能を使って,ビルドされたイメージを圧縮したり,アーティファクトとしてアップロードできることを学ぶ.今回は Vagrant 用の .box
ファイルを作るため,テンプレートに post-processors
を追加する.
{
"builders": [
(中略)
],
"provisioners": [
(中略)
]
"post-processors": [
"vagrant"
]
}
同様に packer validate
と packer build
で AMI を作ると,実際に packer_amazon-ebs_aws.box
も一緒に作られていた.
$ packer validate example.json
Template validated successfully.
$ packer build example.json
amazon-ebs output will be in this color.
(中略)
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-xxxxxxxxxxxxxxx
--> amazon-ebs: 'aws' provider box: packer_amazon-ebs_aws.box
packer.io
Next Steps
「Next Steps」ステップでは,公式ドキュメントや GitHub や Google Group の紹介となっている.
packer.io
github.com
まとめ
- 「HashiCorp Learn Platform」の学習コンテンツに「Vagrant」と「Packer」が追加されていた
- 「Learn to build automated machine images with Packer」の「Getting Started」を実施した
- Packer を使って AMI を作れるため,Packer 未経験者に最適な学習コンテンツだと思う
HashiCorp Learn 関連
kakakakakku.hatenablog.com
kakakakakku.hatenablog.com