kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Packer 未経験者に最適な HashiCorp Learn の Packer コースを実施した

少し前に 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_keyaws_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 validatepacker 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 validatepacker 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 validatepacker 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