⚰️

これからPackerを使うあなたへ - 1.7系編

5 min read

はじめに

Packerの1.7系を使ってみたので使用感などをお伝えしていきます
投稿時の最新バージョンは 1.7.3 です

Packerさんと初対面の方は、以前投稿した これからPackerを使う人へ という記事がありますのでご参考にしていただければと思います
ということで、今回はPackerさんとはなんぞやって部分は省きますのでご了承ください

リポジトリも公開しておりますがあくまでもご参考程度に留めていただければと思います

複数バージョンの併用

細かい話は省きますが、前回と同様に プリコンパイルされたバイナリ を使います
(各OSごとにパッケージも配布されています)

最新バージョンはパッケージ管理コマンドでインストールし、
旧バージョンはプリコンパイルされたバイナリ を使うといったやり方が良さげかなって書きながら思いました

インストール

前回記載したインストール方法 をご参照ください

とりあえず、複数バージョン使えるようにしておきました

1.6.0
$ which packer-160
/usr/local/bin/packer-160
$ packer-160 -v
1.6.0
1.7.3
$ which packer-173
/usr/local/bin/packer-173
$ packer-173 -v
1.7.3

変更点

以前までは、テンプレートはJsonで作成する必要がありましたが、
1.7系からは HCL2(HashiCorp configuration language2)が推奨されました
この形式は Terraform で採用されています

コマンド

端的にいうと、以下のコマンドが追加されました

  • fmt
  • hcl2_upgrade
  • init

hcl2_upgrade

https://www.packer.io/docs/commands/hcl2_upgrade

Json形式 → HCL2形式 に変換し、ファイルを生成してくれます
ただし、なんでも変換してくれるわけではなく、以前のバージョンのPackerで使える記述になっていればです

sample.jsonをHCL2に変換
$ packer hcl2_upgrade -output-file=sample.pkr.hcl sample.json
Successfully created sample.pkr.hcl. Exit 0

-output-file: 任意のパスに出力できます
上記オプションを使用しない場合は、.pkr.hcl がファイル末尾につきます

サンプルは以下を参照していただければと思います

https://github.com/kaqua/border-collie/tree/main/packer17x/sample

fmt

https://www.packer.io/docs/commands/fmt

フォーマットチェックみたいなものです

-check: 適切なフォーマットであれば終了ステータスは0、それ以外はゼロ以外になります
-diff: フォーマット変更の差分を表示する(変更も行います
-write=false: ソースファイルを変更しないようにします

例えば、先ほどHCL2に変換したサンプルテンプレートを少し編集して実行してみました

diffオプション
$ packer fmt -diff sample/sample.pkr.hcl 
sample/sample.pkr.hcl
--- old/sample/sample.pkr.hcl
+++ new/sample/sample.pkr.hcl
@@ -1,7 +1,7 @@
 
 data "amazon-ami" "autogenerated_1" {
   filters = {
-      name = "amzn2-ami-hvm-*-x86_64-gp2"
+    name = "amzn2-ami-hvm-*-x86_64-gp2"
   }
   most_recent = true
   owners      = ["amazon"]

diffコマンドをやってそうですね。ただしこのままだと変更した部分が元に戻る仕様みたいなので
オプションの -write=false を併用することで差分だけ出力するようにできます

-check はデフォルトで -write=false が設定されているようなので変更されません

checkオプション
$ packer fmt -check sample/sample.pkr.hcl
sample/sample.pkr.hcl

変更がある場合は、上記のようにファイル名が出力されます

init

https://www.packer.io/docs/commands/init

指定したプラグインをインストール及びアップデートできます

プラグインインストール
$ packer init plugins.pkr.hcl 
Installed plugin github.com/wata727/amazon-ami-management v1.1.2 in "/Users/kaqua/.packer.d/plugins/github.com/wata727/amazon-ami-management/packer-plugin-amazon-ami-management_v1.1.2_x5.0_darwin_amd64"

プラグインの記述があるファイルを指定して実行するだけなので簡単です
またローカルのどこに配置されたかも出力されています

ファイルの中身は以下を参照していただければと思います

https://github.com/kaqua/border-collie/blob/main/packer17x/plugins.pkr.hcl

マシンイメージを作る

やっとメインです
今回は、AWSのマシンイメージ(AMI)を作成します

作成したいイメージのサービスアカウントや権限が必要になりますのでご注意ください

クラウドサービスの場合は、インスタンスを起動するため従量課金です

使用するファイル

使用するファイル
$ tree
.
├── build.pkr.hcl # 以前の builders 部分用ファイル
├── plugins.pkr.hcl # init用ファイル
├── sources.pkr.hcl # 以前の provisioners 部分用ファイル
├── variables.pkr.hcl # 変数用ファイル
└── {environment}.pkrvars.hcl # 変数用(オーバーライド)ファイル

ファイルの中身については以下をご参照ください

https://github.com/kaqua/border-collie/tree/main/packer17x

Terrafrom を使ったことはありませんが、少し調べたらファイルを分けて管理できるとのことでした
上記のファイル群は、サンプルテンプレートをHCL2に変換した際に生成されたファイルを分割し、少し修正したものになります

修正した箇所

変換後のサンプルテンプレートを見ると、"autogenerated_1" と表記されている場所がありますが、Packer側で自動的に付与した値です

sample.pkr.hclの一部
data "amazon-ami" "autogenerated_1" {
  filters = {
    name = "amzn2-ami-hvm-*-x86_64-gp2"
  }

autogenerated_1 という値で他のファイルから参照できるようにしているみたいなのでわかりやすいように変更してみました(値は何でも大丈夫です)

sources.pkr.hclの一部
source "amazon-ebs" "src" {
  ami_name      = "${var.name}-${var.env}"
  instance_type = "${var.instance_type}"
build.pkr.hclの一部
build {
  sources = [
    "source.amazon-ebs.src"
  ]

上記のようにしておくことで、ビルド時に指定したソースを使用してくれるようになります

変数ファイルの扱い

ビルド時のオプションで、-var-var-file を指定できますが、以前のバージョンと仕様が変わりましたが以前のように環境ごとに変数ファイルを用意しておくのがベターでしょう

使用するファイルにも記載しましたが以下の使い分けが必要です

  • variables.pkr.hcl
    • 変数用ファイル
  • {environment}.pkrvars.hcl
    • 変数用(オーバーライド)ファイル

以前のバージョンは環境ごとに変数ファイルを用意して、ビルド時に指定すれば済んでいましたが
1.7系からは ベースの変数ファイル + 環境用ファイル という形になりそうです

オーバーライドは上書きするという意味なので、元がないところにオーバーライドは出来ません
そのため管理するファイルが1つ増えます

ベース用の変数ファイルを参照してもらえればと思いますが、具体的な値を入れる必要はなく、type だけ宣言しておき、環境ごとの変数ファイルに具体的な値を入れることで対応できます

ビルド

変数ファイルを指定しない場合
$ packer build .
変数ファイルを指定する
$ packer build -var-file=オーバーライド用ファイル .

ファイルを分割しているためカレントディレクトリを指定しています
(1つのファイルだけの場合の動作確認は行っていません)
またその他のオプションなどについてはご自身でお調べになっていただければと思います。

おわりに

いかがだったでしょうか。
今までPackerを使っていた方にとっては、Jsonで慣れていたから少し億劫に感じる部分があるかもしれません。Terraformを使っている人にとっては、簡単に感じたかもしれません。

個人的には旧バージョンから1.7系のバージョンを試して数時間でマシンイメージを作れたので、そこまで学習コストは高くないと感じました。

このドキュメントを見て Packer1.7系 が使えるようになってくだされば幸いです

早起きした時ってなぜか勉強意欲が高いです。それではおやすみなさい...。(二度寝)