少し前に 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)
Install Packer
「Install Packer」ステップでは,Packer をインストールする.今回は Mac で動かすため,brew を使うことにした.
$ brew install packer $ packer --version 1.4.1
OS ごとにバイナリも公開されている.
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
詳細は以下の公式ドキュメントに載っている.
次に「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 を使うときに知っておくべき内容も記載されていて良かった.
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」などもある.
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
Next Steps
「Next Steps」ステップでは,公式ドキュメントや GitHub や Google Group の紹介となっている.
まとめ
- 「HashiCorp Learn Platform」の学習コンテンツに「Vagrant」と「Packer」が追加されていた
- 「Learn to build automated machine images with Packer」の「Getting Started」を実施した
- Packer を使って AMI を作れるため,Packer 未経験者に最適な学習コンテンツだと思う