Packer1.7.x以降に対応する


はじめに

Packerのバージョン1.7.x以上に対応した内容です
※Packer 1.7.x 以上に対応した記事を公開していましたが、新しく作成ました

1.7.x から追加されたコマンドも含めて、確認します
(HCL2をベースに記載します)

コマンド

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

※以降に記載するコマンドは --help を使って表示された Usage を記載しています

hcl2_upgrade

バージョン 1.7 から追加されました

JSON形式で定義していたファイルをHCL2形式に変換してくれるコマンドです
(バージョン1.7以降もJSON形式で動作しますが、HCL2が推奨されています)

$ packer hcl2_upgrade [options] TEMPLATE

オプションの -output-file を指定しない場合は、{元のファイル名}.pkr.hcl となります
sample.json だった場合は、 sample.json.pkr.hcl となります

console

Packer変数の補間を試すときに役立つコマンドです

$ packer console [options] [TEMPLATE]

consoleから抜けたい場合は、Ctrl+Cexit を実行してください

consoleにはモードがあるようで、デフォルトは JSON? のようです
--config-type=hcl2 を指定することで、HCL2の機能が使えるようになります

  • JSONモード
$ packer console -var "environment=test"
> {{user `environment`}}
> test
> {{timestamp}}
> 1648863013
  • HCL2モード
$ packer console -var "environment=test" --config-type=hcl2
Error: Undefined -var variable

何かエラーでました

Error: Undefined -var variable

-var-var-file を使うには変数を事前に定義しておく必要があるようです
サンプルとして以下の内容で変数ファイルを用意して確認してみます

sample.pkr.hcl
$ cat sample.pkr.hcl 
variable "environment" {
  type    = string
  default = ""
}
variable "port" {
  type    = number
  default = 80
}

.pkr.hcl がついているテンプレートを指定して実行する場合は、HCL2モードになるようです
(--config-type=hcl2 も一緒に指定すると JSONモード で起動する模様っぽいです)

$ packer console -var "environment=test" -var "port=8080" sample.pkr.hcl
> var
> {
  "environment" = "test"
  "port" = 8080
}
> var.environment
> test
> "${var.port}"
> 8080

出力を見てわかるように、オプションで指定した値でオーバーライドされています
変数へのアクセスは var.変数名 もしくは "${var.変数名}" どちらでも可能です

ちなみに変数だった timestamp は関数になったようです

$ packer console --config-type=hcl2
> timestamp()
> 2022-04-02T02:21:12Z
> formatdate("YYYYMMDD'T'HH:mm:ssZ", timestamp())
> 20220402T02:22:06Z

init

バージョン 1.7 から追加されました

Packerプラグインのバイナリをインストールするためのコマンドです
フォルダ(ディレクトリ)を指定すると、中に入っているファイルが対象になります
またオプション -upgrade をつけると、プラグインの最新バージョンをインストールします

$ packer init [options] [config.pkr.hcl|folder/]

成功すると、以下のようなログが出力されます

Installed plugin {プラグインソース} {バージョン} in "{インストール先パス}"

プラグインのインストール先は、デフォルトだと Packerのホームディレクトリにあるようです
詳細は公式ドキュメントをご確認ください

https://www.packer.io/docs/configure#packer-s-plugin-directory

plugins

バージョン 1.8 から追加されました

プラグインに対してサブコマンドを実行するコマンドです

$ packer plugins <subcommand> [options] [args]

サブコマンドは以下の4つです

  • install
    指定したプラグインをインストールします
  • installed
    インストール済みのプラグインを出力してくれます
  • remove
    指定したプラグインを削除します
  • required
    指定したテンプレート(ディレクトリ)から必要なプラグインを出力してくれます

install は init と違いファイルを用意しなくて済むので、試したいプラグインがある場合に使い勝手が良さそうです

inspect

テンプレートが定義するコンポーネントを解析して出力するコマンドです

$ packer inspect TEMPLATE

テンプレートを分割して管理する場合などは、正しく設定が出来ているかを確認できそうです

出力結果のサンプル
Packer Inspect: HCL2 mode

> input-variables:

var.environment: ""
var.port: 8080

> local-variables:


> builds:

  > <unnamed build 0>:

    sources:

      amazon-ebs.sample

    provisioners:

      shell

    post-processors:

      <no post-processor>

fix

※バージョン1.8.0の時点ではJSONのみ対応しています

テンプレートを読み取り、既知の後方非互換性の修正を行うコマンドです

$ packer fix [options] TEMPLATE

変更されたテンプレートは標準出力できるため、リダイレクトを使って別ファイルに書き出した方が良さそうです

$ packer fix old.json > new.json

validate

テンプレートの構文と構成を検証するためのコマンドです
ビルド前に実行して構文、構成にエラーがないかを確認するといいと思います

$ packer validate [options] TEMPLATE

-except-only は特定のビルド部分だけを検証するために使うオプションですが、
HCL2では、ソースブロックの name まで指定するようになりました

例えば、builder のタイプ amazon-ebs に関して検証したい場合

  • JSON
    全ての amazon-ebs が対象
  • HCL2
    amazon-ebs.{name} が対象

おそらく上記のような動作になると思います
テンプレートに同じbuilderタイプを複数指定してある場合に使いやすくなったと思います

fmt

HCL2構成ファイルを標準の形式とスタイルにフォーマットするコマンドです
対象となるのは、ファイル名の末尾に pkr.hcl.pkrvars.hcl がついているファイルだけです

$ packer fmt [options] [TEMPLATE]

-check-diff を一緒に指定し、変更点があるかを確認するといいと思います
サブディレクトリにあるテンプレートも確認したい場合は、-recursive を設定してください

フォーマットする場合は、-check を外せばOKです(出力が必要なければ -diff も外してください)

$ packer fmt -check -diff -recurive .

build

テンプレートに設定された内容でアーティファクトを生成します

$ packer build [options] TEMPLATE

バージョン1.7未満の時と同様に、-var-var-file で変数を指定してビルドするといいと思います

ビルドが失敗するときや、処理がうまくいっているかなどを確認したい場合は -debug を使いましょう
各ステップごとにキーボードからの入力を待つため、その間に起動したサーバ(インスタンス)にアクセスし、状況を確認することが出来ます

ビルドしてみる

ということで前置きが長くなりましたが、AWSのAMIを作成してみたいと思います

テンプレートは以下のリポジトリに置きました

https://github.com/kaqua/golden-retriever/tree/main/packer180/packer/hcl2

プラグインをインストール

今回は、amazon-ami-management を使わせていただきました

https://github.com/wata727/packer-plugin-amazon-ami-management

$ packer init plugins.pkr.hcl
$ packer plugins installed

構文チェック

構文チェックをして、エラーが出ないことを確認します

$ packer validate .

ビルド

変数ファイルを環境ごとに用意するやり方です

$ packer build -var-file "variables/production.pkr.hcl" .
amazon-ebs.sample: output will be in this color.

==> amazon-ebs.sample: Prevalidating any provided VPC information
==> amazon-ebs.sample: Prevalidating AMI Name: sample-production-20220402T0704Z
省略
==> amazon-ebs.sample: Running post-processor:  (type amazon-ami-management)
    amazon-ebs.sample (amazon-ami-management): Processing in ap-northeast-1
Build 'amazon-ebs.sample' finished after 5 minutes 47 seconds.
省略
--> amazon-ebs.sample: AMIs were created:
ap-northeast-1: ami-xxxxxxxxxxxxx

無事に作成できました

おわりに

テンプレートの変換を行ってくれるコマンドが用意されているため、簡単にHCL2への移行がしやすくなっています
バージョン1.7未満をお使いの方は、これを機にアップグレードしてみてはいかがでしょうか