Packer1.7.x以降に対応する
はじめに
Packerのバージョン1.7.x以上に対応した内容です
※Packer 1.7.x 以上に対応した記事を公開していましたが、新しく作成ました
1.7.x から追加されたコマンドも含めて、確認します
(HCL2をベースに記載します)
コマンド
※以降に記載するコマンドは --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+C
や exit
を実行してください
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
を使うには変数を事前に定義しておく必要があるようです
サンプルとして以下の内容で変数ファイルを用意して確認してみます
$ 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のホームディレクトリにあるようです
詳細は公式ドキュメントをご確認ください
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を作成してみたいと思います
テンプレートは以下のリポジトリに置きました
プラグインをインストール
今回は、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未満をお使いの方は、これを機にアップグレードしてみてはいかがでしょうか
Discussion